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

C# 如何创建异步web api控制器操作,c#,asp.net-mvc,asp.net-web-api,async-await,C#,Asp.net Mvc,Asp.net Web Api,Async Await,基于我的另一个 我已经创建了以下异步web api控制器操作,但它永远不会返回 public async Task<string> Tester() { Task t = new Task(() => Thread.Sleep(2000)); await t; return "OK"; } 我做错了什么?它永远不会返回,因为任务从未启动,所以它会挂起。调用任务。启动方法: 或使用任务。改为运行: 或者改用Task.Delay,它是非阻塞的,除非您使

基于我的另一个

我已经创建了以下异步web api控制器操作,但它永远不会返回

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

    await t;

    return "OK";
}

我做错了什么?

它永远不会返回,因为任务从未启动,所以它会挂起。调用任务。启动方法:

或使用任务。改为运行:

或者改用Task.Delay,它是非阻塞的,除非您使用了Thread.Sleep,仅举一个例子:

Task t = Task.Delay(2000);
请记住,在web应用程序中,除I/O绑定工作外,所有工作都应该是同步的。将CPU绑定的工作延迟到线程池不会给您带来任何好处——如果有任何好处的话,它会影响性能


请参阅Stephen Cleary的

它永远不会返回,因为任务从未启动,所以它会挂起。调用任务。启动方法:

或使用任务。改为运行:

或者改用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";
    }

我在控制台应用程序中尝试了它,它成功了

您只需启动任务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";
    }

@是的,是的。DB访问通常受益于异步。我使用fiddler同时运行它10次,但它分别在2、4、6、20秒后返回。为什么?为什么它仍然是顺序的?@EladKatz您不需要异步就能同时处理多个请求。如果您的请求是按顺序处理的,那么您的问题就在其他地方。似乎是配置问题,可能在IIS或Web.config上,我不知道,我从未见过。@EladKatz是的,是的。DB访问通常受益于异步。我使用fiddler同时运行它10次,但它分别在2、4、6、20秒后返回。为什么?为什么它仍然是顺序的?@EladKatz您不需要异步就能同时处理多个请求。如果您的请求是按顺序处理的,那么您的问题就在其他地方。似乎是配置问题,可能在IIS或Web.config上,我不知道,我从未见过。