![](/img/trans.png)
[英]Synchronously calling async method in WebAPI deadlocks even with ConfigureAwait(false)
[英]ConfigureAwait(false) still deadlocks
我一直在閱讀async/await
,並試圖通過在UI線程上調用WebClient.DownloadStringTaskAsync
然后在任務執行時調用UI線程上的task.Result
來重現Windows窗體中的死鎖場景。 這導致了僵局。
然后我嘗試通過在返回的任務上調用ConfigureAwait(false)
來解決該問題,但令我驚訝的是仍然導致死鎖。 我的理解是它應該在不同的線程上執行方法的延續,因此不應該有死鎖。 我錯過了什么?
我知道如何解決這個問題但是認為ConfigureAwait(false)
也會修復它。
這是代碼,我使用的是.NET 4.5
private async void button1_Click(object sender, EventArgs e)
{
// Deadlocks!
Task<string> task = DownloadAsync();
textBox1.Text = task.Result;
// Works
//textBox1.Text = await DownloadAsync();
}
private static async Task<string> DownloadAsync()
{
var client = new WebClient();
string result = await client.DownloadStringTaskAsync("http://www.rpmglobal.com").ConfigureAwait(false);
return result;
}
WebClient
仍會導致此死鎖,因為DownloadStringTaskAsync
只是EAP方法的包裝器,它總是在原始上下文中引發它們的事件。 沒有辦法把它關掉。
嘗試使用HttpClient
(或類似Task.Delay
類的Task.Delay
)來查看差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.