【问题标题】:ConfigureAwait(false) still deadlocksConfigureAwait(false) 仍然死锁
【发布时间】:2013-08-30 03:52:24
【问题描述】:

我一直在阅读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;
    }

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

    WebClient 仍然会导致这种死锁,因为DownloadStringTaskAsync 只是 EAP 方法的包装,它们总是在原始上下文中引发它们的事件。无法关闭此功能。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2019-06-19
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多