据我了解,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/