引用以下帖子,它使人们相信 .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
最佳答案
答案是:这取决于情况。
涉及一些计算工作的任务将在线程上运行,通常该线程是线程池中的线程。
长时间运行的任务,即使用选项 TaskCreationOptions.LongRunning
创建的任务,在为其创建的专用线程上运行。
I/O 任务,例如 await stream.ReadAsync()
根本没有线程。操作被发送到IO设备,CPU就可以自由地做它想做的事了。仅当设备准备好请求的数据时,它才会中断 CPU,执行一些低级处理,最终操作系统从线程池中获取一个线程来完成任务并生成结果可供您的程序使用。更多详情here .
关于c# - .NET 任务中的代码最终是否通过 native Windows 线程在 CPU 或 CPU 核心上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951295/