2013-08-30 69 views
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; 
    } 

回答

10

WebClient仍然会造成这种僵局,因为DownloadStringTaskAsync就要到了EAP方法,其中总是提高他们的事件在原始环境的包装。无法关闭此功能。

尝试使用HttpClient(或者像Task.Delay那样简单)来查看差异。

相关问题