如何创建异步web api控制器操作

本文关键字:web api 控制器 操作 异步 何创建 创建 | 更新日期: 2023-09-27 18:29:15

(基于我在这里的另一个问题)

我已经创建了以下异步webapi控制器操作,但它从未返回

public async Task<string> Tester()
{
    Task t = new Task(() => Thread.Sleep(2000));
    await t;
    return "OK";
}

我做错了什么?

如何创建异步web api控制器操作

它从不返回,因为任务从未启动,所以它挂起。调用Task.Start方法:

Task t = new Task(() => Thread.Sleep(2000));
t.Start();

改用Task.Run

Task t = Task.Run(() => Thread.Sleep(2000));

或者使用Task.Delay,这是非阻塞的(除非您只是为了示例而使用Thread.Sleep):

Task t = Task.Delay(2000);

请记住,在web应用程序中,除了I/O绑定工作之外的所有都应该是同步的。将CPU绑定的工作延迟到线程池不会给你带来任何好处——如果有什么好处的话,它会损害性能。

请参阅Stephen Cleary的任务。运行礼仪示例:不要使用任务。在实现中运行

我在控制台应用程序中尝试过,它成功了!

你只需要开始任务t:

static void Main(string[] args)
    {
        string test = Tester().Result;
        Console.WriteLine(test);
    }
    public static async Task<string> Tester()
    {
        Task t = new Task(() => System.Threading.Thread.Sleep(2000));
        t.Start();
        await t;
        return "OK";
    }