簡體   English   中英

需要解決asp.net異步控制器中的線程死鎖情況的解決方案

[英]Need a solution for the threads deadlock situation in asp.net async controller

假設我有一種通過.net mongo驅動程序調用Mongodb數據庫的方法(下面提到的Collection對象是其Api的一部分):

    public virtual Task<List<T>> GetAllAsync()
    {
        return Collection.Find(Filter.Empty).ToListAsync();
    }

現在,我有一個異步asp.net控制器,我想從中調用此方法。 但是,此示例遇到線程死鎖問題,導致當前的asp.net線程掛起:

public class TestController : AsyncController
{
    [HttpGet]
    public async Task<ActionResult> TestAction()
    {
         var data = await GetAllAsync<Client>();
         ...
    }
}

盡管此示例可以正常運行:

public class TestController : AsyncController
{
    [HttpGet]
    public async Task<ActionResult> TestAction()
    {
         var data = await GetAllAsync<Client>().ConfigureAwait(false);
         ...
    }
}

在后面的示例中,唯一的區別是ConfigureAwait(false)

我應該在這種情況下到處添加此ConfigureAwait(false) ,還是有一個更優雅的解決方案?

更新 :如果我從頭開始創建MVC項目,則相同的操作方法可以正常工作,而不會陷入死鎖問題。 盡管如果我使用遷移到新MVC的舊MVC項目,則在第一個示例中會出現死鎖問題。 不知道這兩者之間有什么區別,我打開packaged.config和bin目錄,並確保使用相同版本的Microsoft.AspNet。*,C#代碼相同。 唯一不同的是舊解決方案已預先安裝了StructureMap和Cassette之類的內容,可能是web.config中的一些不同設置也影響了控制器的行為。

ConfigureAwait(false)不能用於操作方法,因為執行必須在await之后返回到同步上下文。

在任何其他方法上,都應使用ConfigureAwait(false)

如果某些代碼正在異步方法中同步阻塞,則整個對象都會阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM