c# - .Net 并行、任务 API 与常规线程

标签 c# .net multithreading parallel-processing

据我了解,Parallel API 在内部使用线程池,它们将项目排队以进行并行处理,但是,当我使用 SOS 调试器检查一个这样的并行循环的执行时,我的理解是,如果我有 10 个任务排队然后所有这些可能不会并行进行,CLR 将决定为要执行的给定任务分派(dispatch)多少线程,因此它可能是 4 或 5 或 6(每次执行中的数量不同)

但是,如果我的任务总数不是很高,如 10,并且我希望它们全部并行运行,因为它们都在长时间运行,那么最好将它们放在传统线程上,这将确保 1每个任务的线程,它们都是并行的 如果任务数量很好,比如 100,那么使用 Parallel 或 Threadpool 是一个实用的解决方案,因为我们不想为每个进程调用 100 个单独的线程

请分享您的观点,我理解并行 API 的好处使得完整的并行编程非常容易实现,但我的目标不同

最佳答案

默认情况下,.NET 线程池会初始化一些工作线程,这些工作线程与您机器上的逻辑核心数相对应。随后,它采用爬山启发法,根据当前任务工作量调整此数字,在任务完成时间过长时启动新的工作线程。

您希望通过线程超额订阅(即每个逻辑核心运行多个线程)同时执行长时间运行的任务是正确的。事实上,任务并行库基础结构 (TPL) 通过 LongRunning 专门为此场景提供选项,它(在当前实现下)为每个如此标记的任务生成一个新的专用线程。

Task.Factory.StartNew(myLongRunningAction, TaskCreationOptions.LongRunning);

关于c# - .Net 并行、任务 API 与常规线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18844333/

相关文章:

c# - 如何避免堆栈溢出?

c# - 写入json重构代码

c# - 如何在 WinForms 应用程序中创建自定义剪贴板格式

.net - 回发后 View 状态不会持续存在

c# - 使用 LINQ 将列表复制到不同的列表

C# - 将数据从 ThreadPool 线程传回主线程

c# - 调试时使用 visual studio 命令运行实例方法

javascript - 使电子邮件正则表达式以逗号分隔

c# - 客户端/服务器 Winforms C#

python - 从多个 shell 子进程中非阻塞实时读取 (Python)