5

私は少し読んでいて、タスクの実行中にUIスレッドを呼び出してからUIスレッドをasync/await呼び出すことにより、Windowsフォームでデッドロックシナリオを再現しようとしていました。これにより、デッドロックが発生しました。WebClient.DownloadStringTaskAsynctask.Result

次に、返されたタスクを呼び出して問題に対処しようとしまし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;
    }
4

1 に答える 1

12

WebClientは、元のコンテキストで常にイベントを発生させるEAPメソッドDownloadStringTaskAsyncの単なるラッパーであるため、このデッドロックが引き続き発生します。これをオフにする方法はありません。

HttpClient(または のような単純なもの) を使用してみてTask.Delay、違いを確認してください。

于 2013-08-30T04:00:48.387 に答える