2013-08-30 20 views
5

Ich habe ein wenig über async/await gelesen und versucht, ein Deadlock-Szenario in Windows Forms zu reproduzieren, indem WebClient.DownloadStringTaskAsync auf dem UI-Thread aufrufen und dann task.Result auf dem UI-Thread aufgerufen, während die Aufgabe ausgeführt wurde . Dies führte zu einem Deadlock.ConfigureAwait (false) immer noch Deadlocks

Dann versuchte ich, das Problem anzugehen, indem ich ConfigureAwait(false) auf die zurückgegebene Aufgabe anrief, aber zu meiner Überraschung verursachte das noch einen Deadlock. Mein Verständnis ist, dass es die Fortsetzung der Methode auf einem anderen Thread ausführen sollte und daher sollte es kein Deadlock geben. Was vermisse ich?

Ich weiß, wie man das Problem umgehen, aber dachte, ConfigureAwait(false) würde es auch beheben. Hier

ist der Code, ich 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; 
    } 

Antwort

10

WebClient bin mit noch aus dieser Sackgasse führen, weil DownloadStringTaskAsync ist nur ein Wrapper um die EAP Methoden, die immer ihre Veranstaltung im ursprünglichen Kontext erhöhen. Es gibt keine Möglichkeit, das auszuschalten.

Versuchen Sie mit HttpClient (oder etwas einfaches wie Task.Delay), um den Unterschied zu sehen.

Verwandte Themen