(基于我的其他question here)
我创建了以下异步web-api-controller操作,但它永远不会返回
public async Task<string> Tester()
{
Task t = new Task(() => Thread.Sleep(2000));
await t;
return "OK";
}
我做错了什么?
答案 0 :(得分:9)
它永远不会返回,因为任务从未启动过,因此它会挂起。调用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的Task.Run Etiquette Examples: Don't Use Task.Run in the Implementation
答案 1 :(得分:1)
我在控制台应用程序中尝试过它并且有效!
您只需要开始执行任务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";
}