5
私はasync/await
を少し読んでいましたが、Windowsフォームでデッドロックシナリオを再現しようとしましたが、UIスレッドでWebClient.DownloadStringTaskAsync
を呼び出してから、UIスレッドで。これによりデッドロックが発生しました。ConfigureAwait(false)は依然としてデッドロックです
次に、返されたタスクでConfigureAwait(false)
を呼び出して問題を解決しようとしましたが、驚いたことに依然としてデッドロックが発生しました。私の理解は、それが別のスレッド上のメソッドの継続を実行する必要があり、したがってデッドロックがないはずです。私は何が欠けていますか?
私はこの問題を回避する方法を知っていますが、ConfigureAwait(false)
もそれを修正すると考えています。ここで
DownloadStringTaskAsync
が
常には元のコンテキストでそのイベントを発生させる
EAP方法、単なるラッパーであるため、まだこのデッドロックが発生します
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;
}