簡體   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