c# - .NET 任务中的代码最终是否通过 native Windows 线程在 CPU 或 CPU 核心上运行?

标签 c# .net multithreading task task-parallel-library

引用以下帖子,它使人们相信 .NET 任务在不涉及 native 操作系统线程的情况下执行。这是真的吗?

Difference between Task (System.Threading.Task) and Thread

编辑

在审查重复问题时,我找不到直接解决实例化 .NET Task 类最终将在 native 操作系统线程上执行的问题的答案。它们指的是线程,但要么不区分托管线程和 native 操作系统线程,要么仅指托管线程。唯一可以重复的是我自己对其中一个问题的回答。

但在我自己的挖掘中,似乎 .NET 没有“魔法”可以避免 native 操作系统线程。 Windows 内核没有进行任何更改来允许此操作。这与我几十年前的操作系统经验是一致的。简而言之,任何人都可以编写不在 native Windows 操作系统线程上运行的应用程序代码。

About Processes and Threads Managed Threading

另外:

Windows Kernel Internals Process Architecture

Architecture of the Windows Kernel

Evolution of the Windows Kernel Architecture

最佳答案

答案是:这取决于情况。

涉及一些计算工作的任务将在线程上运行,通常该线程是线程池中的线程。

长时间运行的任务,即使用选项 TaskCreationOptions.LongRunning 创建的任务,在为其创建的专用线程上运行。

I/O 任务,例如 await stream.ReadAsync() 根本没有线程。操作被发送到IO设备,CPU就可以自由地做它想做的事了。仅当设备准备好请求的数据时,它才会中断 CPU,执行一些低级处理,最终操作系统从线程池中获取一个线程来完成任务并生成结果可供您的程序使用。更多详情here .

关于c# - .NET 任务中的代码最终是否通过 native Windows 线程在 CPU 或 CPU 核心上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951295/

相关文章:

c# - 从类型定义字符串实例化 System.Type

c# - Entity Framework 4 - 用户名和电子邮件列独特的问题

c# - 在循环内执行 Web 请求仅适用于第一遍

c++ - 为什么并行化会如此显着地降低性能?

c# - 以相同的方法在新线程中启动

c++ - 在 C/C++ 中,是否保证 volatile 变量在线程之间具有最终一致的语义?

c# - 按自定义顺序通过枚举订购对象

c# - 如何使用 .NET 从十六进制颜色代码中获取颜色?

c# - 将 Azure Application Insights 与 Azure WebJob 结合使用

c# - .Net async ForEach() 委托(delegate)抛出任务取消异常