使用任务并行库时,是否可以确保我当时每个处理器只运行一个任务?如果没有,在C#中执行此操作的最佳方法是什么?
注意:我不是为了提高性能,而是为了使每项任务的时间更加可靠。有关详细信息,请参阅此问题:Timing of parallel actions using the Task Parallel Library in C#
答案 0 :(得分:5)
首先,如果你想拥有绝对可靠的时机,那么使用Windows和.Net并不是正确的选择。 Windows,因为它不是real-time OS,它可以根据系统中发生的其他事情为您的代码选择不同的时间。 .Net不是一个好的选择,因为垃圾收集器具有非确定性的时序。
但如果你只是想让时间更可靠,你可以做一些事情。
如果您想在自己的处理器上运行每个线程,您可以手动创建Thread
,然后为每个线程设置ProcessThread.ProcessorAffinity
,但getting the ProcessThread
for a Thread
is not that simple。
如果您只是想确保所有任务立即开始(无论ThreadPool
上当前正在运行的其他任务),您也应该创建自己的Thread
。
但如果您只想确保每个处理器最多只有 一个任务,那么只需将MaxDegreeOfParallelism
设置为Environment.ProcessorCount
。
答案 1 :(得分:1)
您可以使用ParallelOptions指定最大并行度。但是这是一个上限,它不会强制每个核心一个线程,其他约束可能意味着使用更少的核心。
e.g。
var list = new List<int>();
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Parallel.ForEach(list, options);