2013-08-30 100 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那樣簡單)來查看差異。

相關問題