.NET Task中的代码最终是否可以通过本机Windows Thread在CPU或CPU Core上运行?

时间:2018-12-27 22:01:11

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

请参阅以下文章,该文章使人们相信.NET Task可以在不涉及本机OS线程的情况下执行。这是真的吗?

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

编辑

在复查重复的问题时,我找不到直接解决以下问题的答案:实例化.NET Task类最终将在本机OS线程上执行。它们是指线程,但不能区分托管和本机OS线程,还是仅指托管线程。唯一可以重复的是我对这些问题之一的回答。

但是,在挖掘自我时,.NET似乎没有避免本地OS线程的“魔术”。 Windows内核没有更改以允许这样做。这与我几十年前的操作系统经验是一致的。简而言之,没有任何人可以编写的无法在本机Windows OS线程上运行的应用程序代码。

About Processes and Threads Managed Threading

也:

Windows Kernel Internals Process Architecture

Architecture of the Windows Kernel

Evolution of the Windows Kernel Architecture

1 个答案:

答案 0 :(得分:5)

答案是:这取决于。

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

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

I / O任务,例如await stream.ReadAsync() 根本没有线程。该操作将发送到IO设备,并且CPU可以随意执行任何操作。只有当设备准备好请求的数据时,它会中断 CPU,进行一些低级处理,最终OS会从线程池中获取线程来完成任务并得出结果适用于您的程序。更多详细信息here