[英]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.