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