首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConfigureAwait(false)仍然死锁

ConfigureAwait(false)仍然死锁
EN

Stack Overflow用户
提问于 2013-08-30 03:52:24
回答 1查看 1.5K关注 0票数 5

我已经阅读了一些关于async/await的内容,并试图在windows窗体中重现一个死锁场景,方法是在UI线程上调用WebClient.DownloadStringTaskAsync,然后在任务执行时在UI线程上调用task.Result。这导致了僵局。

然后,我试图通过对返回的任务调用ConfigureAwait(false)来解决这个问题,但令我惊讶的是,这仍然导致了一个死锁。我的理解是,它应该在不同的线程上执行方法的延续,因此不应该出现死锁。我遗漏了什么?

我知道如何绕过这个问题,但我认为ConfigureAwait(false)也会解决这个问题。

这是代码,我使用的是Net4.5

代码语言:javascript
复制
    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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-30 04:00:48

WebClient仍然会导致这种死锁,因为DownloadStringTaskAsync只是EAP方法的包装器,这些方法总是在原始上下文中引发它们的事件。没办法把这关了。

尝试使用HttpClient (或一些简单的东西,如Task.Delay)来查看两者之间的区别。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18524609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档