gpt4 book ai didi

c# - 哪个线程运行 `await` 关键字之后的代码?

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

我举个简单的例子:

    private void MyMethod()
{
Task task = MyAsyncMethod();
task.Wait();
}

private async Task MyAsyncMethod()
{
//Code before await
await MyOtherAsyncMethod();
//Code after await
}

假设我在单线程应用程序(如控制台应用程序)中运行上述代码。我很难理解代码 //Code after await 将如何运行。

我知道当我在 MyAsyncMethod() 控件中点击 await 关键字时,控件会返回到 MyMethod(),但随后我锁定了线程使用 task.Wait()。如果线程被锁定,如果本应使用它的线程被锁定,//Code after await 如何运行?

是否会创建一个新线程来运行 //Code after await?或者主线程神奇地跳出 task.Wait() 运行 //Code after await

我不确定这应该如何运作?

最佳答案

如果从主线程调用,发布的代码将在 Winform 应用程序中“死锁”,因为您正在使用 Wait() 阻塞主线程。

But in console app this works. but how?

答案隐藏在 SynchronizationContext.Current 中。 await 捕获“SynchronizationContext”,任务完成后它将在同一个“SynchronizationContext”中继续。

在 winform 应用程序中,SynchronizationContext.Current 将设置为 WindowsFormsSynchronizationContext,这将发布到对“消息循环”的调用,但谁来处理它? out 主线程正在 Wait() 中等待。

在控制台应用程序中 SynchronizationContext.Current 默认情况下不会设置,因此当没有“SynchronizationContext”可用于等待捕获时它将为 null 因此它将安排继续到 ThreadPool(TaskScheduler.Default,即 ThreadpoolTask​​Scheduler),因此 await 之后的代码可以工作(通过线程池线程)。

可以使用 Task.ConfigureAwait(false); 控制上述捕获行为,这将防止 winform 应用程序死锁,但 await 之后的代码不再在 UI 线程中运行。

关于c# - 哪个线程运行 `await` 关键字之后的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543240/

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