5
我一直在读,并试图通过在UI线程上调用WebClient.DownloadStringTaskAsync
在Windows窗体中重现死锁场景,然后在任务执行时在UI线程上调用task.Result
。这导致了僵局。ConfigureAwait(false)仍处于死锁状态
然后我试图通过在返回的任务上调用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;
}