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仍然会导致这种死锁,因为DownloadStringTaskAsync它只是EAP方法的一个包装器,它总是在原始上下文中引发它们的事件。没有办法关闭它。

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

于 2013-08-30T04:00:48.387 回答