gpt4 book ai didi

.net - 异步方法在哪里运行?

转载 作者:行者123 更新时间:2023-12-02 15:34:28 26 4
gpt4 key购买 nike

我已经阅读了很多关于异步等待模式的文章,但我仍然不确定异步方法(等待方法)是否在 UI 线程上运行。我总是以 SynchronizationContext 类结束“异步方法与被调用者在同一个 SynchronizationContext 中运行”这到底是什么意思?

它是新创建的独立线程(我知道不是)还是 ThreadPool 线程?

当我阅读 SynchronizationContext 时,我看到它是某种排队任务执行器,但这些任务在哪里执行?在线程池上?

如果是,async 方法是在 ThreadPool 上执行的,对吗?

最佳答案

标记为 async 的方法在调用它的线程上运行,直到它到达其中的第一个 await 关键字。

但有一个异常(exception):如果在您到达 await 关键字时等待的方法已经运行完毕,那么执行将继续进行而无需切换线程。

public async Task Method()
{
Console.WriteLine(1);
await Something();
Console.Writeline(2);
}

在这种情况下,如果在线程 A 上调用该方法,那么也会从线程 A 打印 1。

然后您转到下一条指令。如果 something 返回的 Task 已经完成,则线程 A 继续执行。如果 something 返回的 Task 仍在运行,那么 2 可以从以下任一方式打印:

  1. 再次线程 A - 如果有 SynchronizationContext 强制执行此操作(如在 WPF 或 WinRT 应用程序中)。简单地说,这是通过排队和调度剩余代码(即第三条指令)在线程 A 上执行来完成的。
  2. 在一个完全不同的线程 B 上。

关于您对ThreadPool的疑惑:

正如我们所见,async 方法不能保证在 ThreadPool 上运行。只有 Task.Run 重载方法之一安排的工作肯定会在 ThreadPool 上运行。引用任务 MSDN文档:

Queues the specified work to run on the ThreadPool and returns a task handle for that work.

public void Task Something()
{
return Task.Run(() => Console.WriteLine(3));
}

3 将由 ThreadPool 上的线程打印。

关于.net - 异步方法在哪里运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426283/

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