使用await时线程返回线程池

use*_*580 0 c# multithreading async-await

但是,使用ASP.NET Web Api,如果您的请求是在一个线程上进行的,并且等待某些函数和调用ConfigureAwait(false) ,则在返回ApiController函数的最终结果时可能会将您置于不同的线程上.

实际上,只是做一个await可以做到这一点.一旦你的async方法遇到一个await,该方法被阻止但线程返回到线程池.当方法准备好继续时,从线程池中抢夺任何线程并用于恢复该方法.

资源

我刚刚在控制台程序中测试过:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 8

我在这里错过了什么?

您缺少编译器警告

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