使用await时线程返回线程池

时间:2015-11-14 17:20:17

标签: c# multithreading async-await

  
    

但是,使用ASP.NET Web Api,如果您的请求是在一个上面     线程,等待一些函数并调用ConfigureAwait(false)     这可能会让你在不同的线程上     返回ApiController函数的最终结果。

  
     

实际上,只做一个await就可以做到这一点。一旦您的async方法点击   一个await,该方法被阻止但线程返回到该线程   池。当方法准备好继续时,将抢夺任何线程   从线程池中用来恢复方法。

Source

我刚刚在控制台程序中对其进行了测试:

async Task foo()
{
    int y = 0;
    while (y<5) y++;
}

async Task testAsync()
{
    int i = 0;
    while (i < 100)
    {
        Console.WriteLine("Async 1 before: " + i++);

    }
    await foo();

    while (i < 105)
    {
        i++;
        Console.WriteLine("Async 1 after: " + i);
    }
}

调用await foo()不会导致线程testAsync正在运行以返回线程池,testAsync只是从头到尾在同一个线程上逐行运行。我在这里错过了什么?

2 个答案:

答案 0 :(得分:7)

  

我在这里错过了什么?

您缺少编译器警告

  

警告CS1998此异步方法缺少'await'运算符并将同步运行。考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作。

答案 1 :(得分:0)

方法foo并非真正异步,因为其中没有await次调用 尝试在其中添加await Task.Delay