編輯:我現在通過簡單地將按鈕點擊處理程序標記爲async void並等待任務來解決問題。我認爲WebForms無法以任何方式處理異步,除非與RegisterAsyncTask一起使用。雖然這解決了我的問題,但我仍然對代碼處於死鎖之下的原因感興趣,因爲它違背了我對當前C#代碼異步工作的理解,所以仍然讚賞答案。ASP.NET死鎖儘管ConfigureAwait(false)
我有一個服務公開了一個異步方法,它向一些api發送一個請求。此方法在webforms代碼隱藏中消耗。我知道ASP.NET只允許一次執行一個線程,因此調用Task.Wait()會導致死鎖,因爲等待處理的任務在上下文線程被阻止時無法在完成時恢復執行。
但是,我的理解(從讀this blog),在等待的任務上調用ConfigureAwait(false)
會導致任務在線程池線程上運行,因此可以恢復上下文線程上的執行。儘管如此,我仍然遇到了來自下面代碼的僵局。爲什麼是這樣?
protected void Activate(object sender, CommandEventArgs e)
{
var someID = int.Parse((string) e.CommandArgument);
DoAsyncThingWithID(someID).Wait();
}
private async Task DoAsyncThingWithID(int ID)
{
try
{
await new SomeService()
.DoSomeAsyncWork(ID)
.ConfigureAwait(false);
}
catch (AppropriateException e)
{
DealWithIt();
}
}
值得注意的是:DoSomeAsyncWork(int)在它下面有更多的異步方法。在底部有一個API包裝對象(負責發送HTTP請求)的方法不是異步,但調用Task.Run(() => api.SendThingy());
這可能是問題嗎?
發佈你的搜索答案並收聽。 –