1

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

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

请分享您的观点,我了解 Parallel API 的好处,使完整的 Parallel 编程非常容易实现,但这里我的目标不同

4

1 回答 1

6

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

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

Task.Factory.StartNew(myLongRunningAction, TaskCreationOptions.LongRunning);
于 2013-09-17T08:05:03.467 回答