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;
}