gpt4 book ai didi

c# - ConfigureAwait(false) 仍然死锁

转载 作者:太空狗 更新时间:2023-10-29 22:22:50 25 4
gpt4 key购买 nike

我已经阅读了一些关于 async/await 的内容,并试图通过在 UI 线程上调用 WebClient.DownloadStringTaskAsync 来重现 Windows 窗体中的死锁场景,并且然后在任务执行时在 UI 线程上调用 task.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;
}

最佳答案

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

尝试使用 HttpClient(或像 Task.Delay 这样简单的东西)看看区别。

关于c# - ConfigureAwait(false) 仍然死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18524609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com