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

Ela*_*atz 1 c# asp.net-mvc async-await asp.net-web-api

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

我创建了以下异步web-api-controller操作,但它永远不会返回

public async Task<string> Tester()
{
    Task t = new Task(() => Thread.Sleep(2000));

    await t;

    return "OK";
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

dca*_*tro 9

它永远不会返回,因为任务从未启动过,因此它会挂起.调用Task.Start方法:

Task t = new Task(() => Thread.Sleep(2000));
t.Start();
Run Code Online (Sandbox Code Playgroud)

或者Task.Run改为使用:

Task t = Task.Run(() => Thread.Sleep(2000));
Run Code Online (Sandbox Code Playgroud)

或者使用Task.Delay非阻塞(除非您Thread.Sleep仅仅为了示例而使用):

Task t = Task.Delay(2000);
Run Code Online (Sandbox Code Playgroud)

请记住,在Web应用程序中,除I/O绑定工作之外的所有内容都应该是同步的.将CPU限制工作推迟到线程池不会给你带来任何东西 - 如果有的话,它会损害性能.

请参阅Stephen Cleary的Task.Run Etiquette示例:不要在实现中使用Task.Run