我已经阅读了很多关于异步等待模式的文章,但我仍然不确定异步方法(等待方法)是否在 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 可以从以下任一方式打印:
- 再次线程 A - 如果有 SynchronizationContext 强制执行此操作(如在 WPF 或 WinRT 应用程序中)。简单地说,这是通过排队和调度剩余代码(即第三条指令)在线程 A 上执行来完成的。
- 在一个完全不同的线程 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/