如何创建异步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";
}
我做错了什么?
它从不返回,因为任务从未启动,所以它挂起。调用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";
}