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

标签 c# .net parallel-processing .net-4.5

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

给定一个对象列表,我想遍历列表中的每个元素并对其调用一个相当耗费资源的方法。我想将其拆分为正在运行的应用程序可用的尽可能多的内核,这样如果它在 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:How to: Write a Simple Parallel.ForEach Loop

关于C#:并行处理列表的基本方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13057219/

相关文章:

c# - 如何将此字符串转换为普通字符串以便将其放入 HTML 文档中?

c# - 在 C# 中使用 shutdown.exe 关闭另一个系统?

远程连接到 SQL Server 2005 实例时出现 C# 异常

amazon-web-services - 关闭 OpenMPI : Error while mpirun on multiple hosts

java - Java 8 并行流中的自定义线程池

c# - 在泛型集合的泛型方法上使用表达式lambda

c# - 将数据绑定(bind)到 jquery 对话框

c# - 页面加载的 PrincipalPermission

c# - Observable.Using( ) 取消

r - 函数内部的 parLapply 意外地将数据复制到节点