gpt4 book ai didi

c# - SynchronizationContext - 奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:50 27 4
gpt4 key购买 nike

public static void Init()
{
//var task = GetSource1();
//var task = GetSource2();
//var task = GetSource3();
var task = MyClient();
MessageBox.Show(task.Result);
}

private static async Task<string> GetSource1()
{
var sourceTask = WebClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}

private static async Task<string> GetSource2()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(true);
return await sourceTask;
}

private static async Task<string> GetSource3()
{
var sourceTask = MyClient();
sourceTask.ConfigureAwait(false);
return await sourceTask;
}

private static async Task<string> WebClient()
{
return await new WebClient().DownloadStringTaskAsync("http://4pda.ru").ConfigureAwait(false);
}

private static Task<string> MyClient()
{
var t = new Task<string>(() => new WebClient().DownloadString("http://4pda.ru"));
t.ConfigureAwait(false);
t.Start();
return t;
}

这段代码工作正常。我在 MessageBox 中获取源代码。但是,为什么我在使用 var task = GetSource3() 时会出现死锁?我认为它一定有效,因为我使用了 ConfigureAwait(false) 并避免了上下文切换

最佳答案

ConfigureAwait 是一个纯方法。它返回一个值,但对自己没有影响。它返回您需要等待的自定义等待 (ConfiguredTaskAwaitable):

await task.ConfigureAwait();

但是,这不是处理死锁的方式。这是一种预防措施,但您应该从一开始就避免阻塞异步代码。

关于c# - SynchronizationContext - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263497/

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