C#:并行处理列表的基本方法?

use*_*457 1 .net c# parallel-processing .net-4.5

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

给定一个对象列表,我想迭代列表中的每个元素,并在其上调用一个相当资源密集的方法.我希望将其分配给正在运行的应用程序可用的核心,这样如果它在8核设备上运行,它一次最多可处理8个元素.所有的计算完全相互独立,我希望当一个元素完成处理时,列表中的下一个元素将被启动.

我不确定在任何给定时间列表中有多少项,我不知道有多少核可用.也许有时候只有一个核心.

谢谢.

sll*_*sll 8

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

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

您还可以指定ParallelOptions和MaxDegreeOfParalellism来控制ThreadPool在线程之间分配工作时可以使用的多个线程.

var options = new ParallelOptions
      {
         MaxDegreeOfParallelism = 2
      };

Parallel.ForEach(items, options, currentItem =>
{
     // TODO
});
Run Code Online (Sandbox Code Playgroud)

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

  • 为了使其高效工作,您的方法不应共享任何资源,无磁盘访问,无锁,无公共/全局变量,它们应该独立工作并以任何顺序处理。如果不满足这些条件中的任何一个,这个小技巧很可能会使速度变慢。 (2认同)