ConfigureAwait(false)仍然是死锁

时间:2013-08-30 03:52:25

标签: c# asynchronous async-await

我一直在async/await上阅读,并试图通过在UI线程上调用WebClient.DownloadStringTaskAsync然后在UI上调用task.Result来重现Windows窗体中的死锁场景任务执行时的线程。这导致了僵局。

然后我尝试通过在返回的任务上调用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;
    }

1 个答案:

答案 0 :(得分:11)

WebClient仍会导致此死锁,因为DownloadStringTaskAsync只是EAP方法的包装,总是在原始上下文中提升事件。没办法把它关掉。

尝试使用HttpClient(或类似Task.Delay之类的简单内容)来查看差异。