ConfigureAwait(false)仍然是死锁

Ned*_*nov 5 c# asynchronous async-await

我一直在阅读,async/await并试图通过调用WebClient.DownloadStringTaskAsyncUI线程然后task.Result在任务执行时调用UI线程来重现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;
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 11

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

尝试使用HttpClient(或类似的东西Task.Delay)来看看差异.