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

标签 .net asynchronous threadpool async-await

我已经阅读了很多关于异步等待模式的文章,但我仍然不确定异步方法(等待方法)是否在 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/

相关文章:

android - 带有 Android 服务的 Socket Io

C# 3 个新功能帖子(与 .Net 3.5 功能无关)

.net - 发布 ASP.NET 应用程序时,是否应该在 Visual Studio 配置管理器中将构建类型更改为发布?

python - 使用 Python 结合 asyncio 进行 Web 抓取

android - 从系统服务到其他应用程序的异步通信

c# - react 太快

c# - 维护多个实例的处理顺序

C# HtmlEncode - ISO-8859-1 实体名称与数字

Java 线程池吞吐量

multithreading - 在Powershell中使用system.thread.threadpool