(基于我的另一个 question here )
我创建了以下异步 web-api-controller 操作,但它永远不会返回
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 绑定(bind)工作外都应该是同步的。将 CPU 密集型工作推迟到线程池不会给您带来任何好处 - 如果有的话,它会损害性能。
参见 Stephen Cleary 的 Task.Run Etiquette Examples: Don't Use Task.Run in the Implementation
