我想做一些我认为相当基本的事情,但我还没有找到一个相当基本的例子。这是我想要做的:
给定一个对象列表,我想遍历列表中的每个元素并在其上调用一个相当耗费资源的方法。我想将其拆分为运行应用程序可用的尽可能多的内核,这样如果它在 8 核设备上运行,它一次最多可以处理 8 个元素。所有的计算都是彼此完全独立的,我希望当一个元素被处理完后,列表中的下一个元素将被启动。
我不确定在任何给定时间列表中有多少项目,我不知道有多少内核可用。有时可能只有一个核心。
谢谢。
我想做一些我认为相当基本的事情,但我还没有找到一个相当基本的例子。这是我想要做的:
给定一个对象列表,我想遍历列表中的每个元素并在其上调用一个相当耗费资源的方法。我想将其拆分为运行应用程序可用的尽可能多的内核,这样如果它在 8 核设备上运行,它一次最多可以处理 8 个元素。所有的计算都是彼此完全独立的,我希望当一个元素被处理完后,列表中的下一个元素将被启动。
我不确定在任何给定时间列表中有多少项目,我不知道有多少内核可用。有时可能只有一个核心。
谢谢。
Parallel.ForEach(items, currentItem =>
{
// TODO: process a current item
Debug.WriteLine("[{0}] {1} {2}",
Thread.Current.ManagedThreadId ,
DateTime.Now,
currentItem);
};
items
变量应该是实现IEnumerable
或的类型的实例IEnumerable<T>
。
您还可以指定ParallelOptions
MaxDegreeOfParalellism 来控制线程池可以使用的线程数,同时在线程之间分配工作。
var options = new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
Parallel.ForEach(items, options, currentItem =>
{
// TODO
});
另请参阅 MSDN:如何:编写简单的 Parallel.ForEach 循环
与其指定计数,不如使用 Environment 来获取,以便随着功能的增加尽可能并行。
Parallel.ForEach(
items,
new ParallelOptions {MaxDegreeOfParallelism =
System.Environment.ProcessorCount
},
item => {
// Work with item
}
);