数据并行(任务并行库)

数据并行是指对源集合或数组中的元素同时(即并行)执行相同操作的情况。 System.Threading.Tasks.Parallel 类中 ForForEach 方法的若干重载支持使用强制性语法的数据并行。 在数据并行操作中,将对源集合进行分区,以便多个线程能够同时对不同的片段进行操作。 TPL 支持通过 System.Threading.Tasks.Parallel 类实现的数据并行。 此类提供 forforeach 循环(Visual Basic 中为 For 和 For Each)基于方法的并行实现。 为 Parallel.ForParallel.ForEach 循环编写循环逻辑与编写顺序循环非常类似。 您不必创建线程或队列工作项。 在基本的循环中,您不必采用锁。 TPL 将为您处理所有低级别工作。 下面的代码示例演示一个简单的 foreach 循环及其并行等效项。

注意注意

本文档使用 lambda 表达式在 TPL 中定义委托。如果不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请参见 在 PLINQ 和 TPL 中的 Lambda 表达式

' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version            
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));

当并行循环运行时,TPL 将对数据源进行分区,以便循环能够同时对多个部分进行操作。 在后台,任务计划程序将根据系统资源和工作负荷来对任务进行分区。 如有可能,计划程序会在工作负荷变得不平衡的情况下在多个线程和处理器之间重新分配工作。

注意注意

您也可以提供自己的自定义分区程序或计划程序。有关更多信息,请参见 PLINQ 和 TPL 的自定义分区程序任务计划程序

Parallel.ForParallel.ForEach 方法都有若干重载,利用这些重载可以停止或中断循环执行、监视其他线程上循环的状态、维护线程本地状态、完成线程本地对象、控制并发程度,等等。 启用此功能的帮助器类型包括 ParallelLoopStateParallelOptions 以及 ParallelLoopResultCancellationTokenCancellationTokenSource

有关更多信息,请参见数据并行(任务并行库)

PLINQ 支持使用声明性语法或查询式语法的数据并行。 有关更多信息,请参见并行 LINQ (PLINQ)

相关主题

标题

说明

如何:编写简单的 Parallel.For 循环

描述如何针对任意数组或可建立索引的 IEnumerable<T> 源集合编写 For 循环。

如何:编写简单的 Parallel.ForEach 循环

描述如何针对任何 IEnumerable<T> 源集合编写 ForEach 循环。

如何:停止或中断 Parallel.For 循环

描述如何停止或中断并行循环,以使所有线程都收到操作通知。

如何:编写具有线程本地变量的 Parallel.For 循环

描述如何编写每个线程都保留任何其他线程看不到的私有变量的 For 循环,以及如何在循环完成时同步所有线程中的结果。

如何:编写具有线程局部变量的 Parallel.ForEach 循环

描述如何编写每个线程都保留任何其他线程看不到的私有变量的 ForEach 循环,以及如何在循环完成时同步所有线程中的结果。

如何:取消 Parallel.For 或 ForEach Loop

描述如何通过使用 System.Threading.CancellationToken 取消并行循环

如何:加快小型循环体的速度

描述在循环体非常小时加快执行速度的一种方式。

任务并行库

提供对任务并行库的概述。

.NET Framework 中的并行编程

介绍 .NET Framework 中的并行编程。

请参见

概念

.NET Framework 中的并行编程