C# ConfigureWait(false)仍然死锁
我已经阅读了一些关于C# ConfigureWait(false)仍然死锁,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我已经阅读了一些关于async/await的内容,并试图通过调用WebClient.DownloadStringTaskAsync在UI线程上,然后在执行任务时在UI线程上调用task.Result,在windows窗体中重现死锁场景。这导致了僵局 然后,我试图通过对返回的任务调用ConfigureAwait(false)来解决这个问题,但出乎意料的是,这仍然导致了死锁。我的理解是,它应该在不同的线程上执行方法的延续,因此不应该出现死锁。我错过了什么 我知道如何回避这个问题,但我认为Config
async/await
的内容,并试图通过调用WebClient.DownloadStringTaskAsync
在UI线程上,然后在执行任务时在UI线程上调用task.Result
,在windows窗体中重现死锁场景。这导致了僵局
然后,我试图通过对返回的任务调用ConfigureAwait(false)
来解决这个问题,但出乎意料的是,这仍然导致了死锁。我的理解是,它应该在不同的线程上执行方法的延续,因此不应该出现死锁。我错过了什么
我知道如何回避这个问题,但我认为ConfigureAwait(false)
也可以解决这个问题
这是代码,我使用的是NET4.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;
}
private async void按钮1\u单击(对象发送方,事件参数e)
{
//死锁!
任务任务=下载异步();
textBox1.Text=task.Result;
//工作
//Text=wait DownloadAsync();
}
私有静态异步任务DownloadAsync()
{
var client=new WebClient();
字符串结果=等待客户端。下载StringTaskAsync(“http://www.rpmglobal.com“”。配置等待(错误);
返回结果;
}
WebClient
仍将导致此死锁,因为downloadstringtasksync
只是方法的包装,这些方法总是在原始上下文中引发事件。没有办法关掉这个
尝试使用HttpClient
(或类似于Task.Delay
的简单方法)查看差异