繁体   English   中英

使用await时线程返回线程池

[英]Thread returning to thread pool when using 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);
    }
}

调用await foo()不会导致正在运行线程testAsync返回线程池,而testAsync只是testAsync在同一线程上testAsync运行。 我在这里想念什么?

我在这里想念什么?

您缺少编译器警告

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM