3

我想做一些我认为相当基本的事情,但我还没有找到一个相当基本的例子。这是我想要做的:

给定一个对象列表,我想遍历列表中的每个元素并在其上调用一个相当耗费资源的方法。我想将其拆分为运行应用程序可用的尽可能多的内核,这样如果它在 8 核设备上运行,它一次最多可以处理 8 个元素。所有的计算都是彼此完全独立的,我希望当一个元素被处理完后,列表中的下一个元素将被启动。

我不确定在任何给定时间列表中有多少项目,我不知道有多少内核可用。有时可能只有一个核心。

谢谢。

4

2 回答 2

10
Parallel.ForEach(items, currentItem =>
{
     // TODO: process a current item
     Debug.WriteLine("[{0}] {1} {2}", 
                    Thread.Current.ManagedThreadId , 
                    DateTime.Now,
                    currentItem);
};

items变量应该是实现IEnumerable或的类型的实例IEnumerable<T>

您还可以指定ParallelOptionsMaxDegreeOfParalellism 来控制线程池可以使用的线程数,同时在线程之间分配工作。

var options = new ParallelOptions
      {
         MaxDegreeOfParallelism = 2
      };

Parallel.ForEach(items, options, currentItem =>
{
     // TODO
});

另请参阅 MSDN:如何:编写简单的 Parallel.ForEach 循环

于 2012-10-24T20:32:32.937 回答
1

与其指定计数,不如使用 Environment 来获取,以便随着功能的增加尽可能并行。

Parallel.ForEach(
    items,
    new ParallelOptions {MaxDegreeOfParallelism =
        System.Environment.ProcessorCount
    },
    item => {
        // Work with item
    }
);
于 2017-05-23T18:31:20.307 回答