C# ConfigureWait(false)仍然死锁

C# ConfigureWait(false)仍然死锁,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我已经阅读了一些关于async/await的内容,并试图通过调用WebClient.DownloadStringTaskAsync在UI线程上,然后在执行任务时在UI线程上调用task.Result,在windows窗体中重现死锁场景。这导致了僵局 然后,我试图通过对返回的任务调用ConfigureAwait(false)来解决这个问题,但出乎意料的是,这仍然导致了死锁。我的理解是,它应该在不同的线程上执行方法的延续,因此不应该出现死锁。我错过了什么 我知道如何回避这个问题,但我认为Config

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

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

我知道如何回避这个问题,但我认为
ConfigureAwait(false)
也可以解决这个问题

这是代码,我使用的是NET4.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;
    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
//死锁!
任务任务=下载异步();
textBox1.Text=task.Result;
//工作
//Text=wait DownloadAsync();
}
私有静态异步任务DownloadAsync()
{
var client=new WebClient();
字符串结果=等待客户端。下载StringTaskAsync(“http://www.rpmglobal.com“”。配置等待(错误);
返回结果;
}

WebClient
仍将导致此死锁,因为
downloadstringtasksync
只是方法的包装,这些方法总是在原始上下文中引发事件。没有办法关掉这个

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