数据并行(任务并行库)
数据并行是指对源集合或数组中的元素同时(即并行)执行相同操作的情况。 System.Threading.Tasks.Parallel 类中 For 和 ForEach 方法的若干重载支持使用强制性语法的数据并行。 在数据并行操作中,将对源集合进行分区,以便多个线程能够同时对不同的片段进行操作。 TPL 支持通过 System.Threading.Tasks.Parallel 类实现的数据并行。 此类提供 for 和 foreach 循环(Visual Basic 中为 For 和 For Each)基于方法的并行实现。 为 Parallel.For 或 Parallel.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.For 和 Parallel.ForEach 方法都有若干重载,利用这些重载可以停止或中断循环执行、监视其他线程上循环的状态、维护线程本地状态、完成线程本地对象、控制并发程度,等等。 启用此功能的帮助器类型包括 ParallelLoopState、ParallelOptions 以及 ParallelLoopResult、CancellationToken 和 CancellationTokenSource。
有关更多信息,请参见数据并行(任务并行库)。
PLINQ 支持使用声明性语法或查询式语法的数据并行。 有关更多信息,请参见并行 LINQ (PLINQ)。
相关主题
标题 |
说明 |
---|---|
描述如何针对任意数组或可建立索引的 IEnumerable<T> 源集合编写 For 循环。 |
|
描述如何针对任何 IEnumerable<T> 源集合编写 ForEach 循环。 |
|
描述如何停止或中断并行循环,以使所有线程都收到操作通知。 |
|
描述如何编写每个线程都保留任何其他线程看不到的私有变量的 For 循环,以及如何在循环完成时同步所有线程中的结果。 |
|
描述如何编写每个线程都保留任何其他线程看不到的私有变量的 ForEach 循环,以及如何在循环完成时同步所有线程中的结果。 |
|
描述如何通过使用 System.Threading.CancellationToken 取消并行循环 |
|
描述在循环体非常小时加快执行速度的一种方式。 |
|
提供对任务并行库的概述。 |
|
介绍 .NET Framework 中的并行编程。 |