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

答えて

10

WebClient NET 4.5を使用しています、コードです。これをオフにする方法はありません。

HttpClient(またはTask.Delayのような単純なもの)を使ってみてください。

関連する問題