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

时间:2014-11-05 08:28:04

标签: c# asp.net-mvc asp.net-web-api async-await

(基于我的其他question here

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

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

    await t;

    return "OK";
}

我做错了什么?

2 个答案:

答案 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";
    }