簡體   English   中英

與異步/等待的死鎖

[英]Deadlock with async/await

假設我正在編寫一個自定義MVC過濾器,它在方法覆蓋中執行一些異步調用,如下所示:

public class MyActionFilter : System.Web.Mvc.ActionFilterAttribute
{
  public override void OnActionExecuted(ActionExecutedContext ctx)
  {
    var stuff = ConfigureAwaitHelper1().Result;
    // do stuff
  }

  public override void OnActionExecuting(ActionExecutingContext ctx)
  {
    var stuff = ConfigureAwaitHelper2().Result;
    // do stuff
  }

  private async Task<string> ConfigureAwaitHelper1()
  {
    var result = await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
    return result;
  }

  private async Task<string> ConfigureAwaitHelper2()
  {
    return await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
  }
}

為什么OnActionExecuting死鎖,而OnActionExecuted卻沒有? 我沒有看到兩者之間的根本區別。 返回操作只在異步任務完成后才會發生,這就像在返回它之前將結果放入“匿名返回”本地var中一樣,所以我不明白為什么前者應該死鎖。

為什么OnActionExecuting死鎖,而OnActionExecuted卻沒有?

我很驚訝它的工作原理。 您遇到死鎖的原因是您在Task上調用.Result 這是邪惡的,你應該只在控制台應用程序中調用.Result.Wait

暫無
暫無

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

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