1

使用任务并行库时,是否可以确保我当时每个处理器只运行一个任务?如果不是,那么在 C# 中执行此操作的最佳方法是什么?

注意:我这样做不是为了提高性能,而是为了让每个任务的时间更可靠。有关更多信息,请参阅此问题:Timing of parallel actions using the Task Parallel Library in C#

4

2 回答 2

5

首先,如果您想获得绝对可靠的时序,那么使用 Windows 和 .Net 不是正确的选择。Windows,因为它不是实时操作系统,它可以根据系统中发生的其他事情为您的代码选择不同的时间。.Net 不是一个好的选择,因为由于垃圾收集器,它具有不确定的时间。

但如果你只是想让时间更可靠一些,你可以做一些事情。

如果你想在自己的处理器上运行每个线程,你可以手动创建Threads 然后ProcessThread.ProcessorAffinity为每个线程设置,但是获取ProcessThreadfor aThread并不是那么简单

如果您只想确保所有任务立即启动(无论当前正在运行的其他任务是什么ThreadPool),您也应该创建自己的Threads。

但是,如果您只想确保每个处理器最多MaxDegreeOfParallelism有一个任务,只需设置为Environment.ProcessorCount.

于 2012-05-10T11:20:56.183 回答
1

您可以使用ParallelOptions指定最大并行度。然而这是一个上限,它不会强制每个内核一个线程,其他约束可能意味着使用更少的内核。

例如

var list = new List<int>();
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;

Parallel.ForEach(list, options);
于 2012-05-10T11:13:00.460 回答