【问题标题】:Does code in a .NET Task ultimately run on a CPU or CPU Core via native Windows Thread? [duplicate].NET 任务中的代码最终是否通过本机 Windows 线程在 CPU 或 CPU 内核上运行? [复制]
【发布时间】:2019-05-25 20:26:52
【问题描述】:

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

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

编辑

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

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

About Processes and Threads Managed Threading

还有:

Windows Kernel Internals Process Architecture

Architecture of the Windows Kernel

Evolution of the Windows Kernel Architecture

【问题讨论】:

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


【解决方案1】:

答案是:视情况而定。

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 2014-06-07
    • 2013-11-04
    • 2017-05-23
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多