数据并行度 是指对源集合或数组中的元素同时执行相同作(即并行执行)的方案。 在数据并行作中,将对源集合进行分区,以便多个线程可以同时在不同段上运行。
任务并行库 (TPL) 通过 System.Threading.Tasks.Parallel 类支持数据并行。 此类对 for 循环和 foreach 循环(Visual Basic 中的 For
和 For Each
)提供了基于方法的并行执行。 为Parallel.For循环或Parallel.ForEach循环编写循环逻辑时,就像编写顺序循环一样。 无需创建线程或队列工作项。 在基本循环中,不需要加锁。 TPL 为你处理所有低级别工作。 有关使用Parallel.For和Parallel.ForEach的详细信息,请下载文档“并行编程模式:了解和应用 .NET Framework 4 的并行模式”。 下面的代码示例演示了一个简单的 foreach
循环及其并行版本。
注释
本文档使用 lambda 表达式在 TPL 中定义委托。 如果不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请参阅 PLINQ 和 TPL 中的 Lambda 表达式。
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
并行循环运行时,TPL 将数据源分区,以便循环可以同时对多个部分进行作。 在后台,任务计划程序根据系统资源和工作负荷对任务进行分区。 如果可能,如果工作负荷变得不平衡,计划程序会在多个线程和处理器之间重新分发工作。
注释
还可以提供自己的自定义分区程序或计划程序。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 任务计划程序。
Parallel.For和Parallel.ForEach方法都有多个重载,可让你停止或中断循环执行、监视其他线程上的循环状态、维护线程本地状态、终结线程本地对象、控制并发程度等。 启用此功能的帮助程序类型包括ParallelLoopState、ParallelOptions、ParallelLoopResultCancellationToken和CancellationTokenSource。
有关详细信息,请参阅 并行编程模式:了解和应用 .NET Framework 4 的并行模式。
PLINQ 支持使用声明性或类似查询的语法的数据并行度。 有关详细信息,请参阅并行 LINQ (PLINQ)。
相关主题
标题 | DESCRIPTION |
---|---|
如何编写简单的 Parallel.For 循环 | 描述如何编写遍历任何数组或可变址 For 源集合的 IEnumerable<T> 循环。 |
如何编写简单的 Parallel.ForEach 循环 | 介绍如何编写遍历任何ForEach源集合的IEnumerable<T>循环。 |
如何:从 Parallel.For 循环停止或中断 | 介绍如何停止或中断并行循环,以通知所有线程这一操作。 |
如何:使用 Thread-Local 变量编写 Parallel.For 循环 | 介绍如何编写一个 For 循环,其中每个线程都维护对任何其他线程不可见的私有变量,以及如何在循环完成时同步所有线程的结果。 |
如何:使用 Partition-Local 变量编写 Parallel.ForEach 循环 | 介绍如何编写一个 ForEach 循环,其中每个线程都维护对任何其他线程不可见的私有变量,以及如何在循环完成时同步所有线程的结果。 |
如何取消 Parallel.For 或 ForEach 迭代循环 | 介绍如何使用System.Threading.CancellationToken取消并行循环。 |
如何:加快小型循环主体的速度 | 描述在循环主体极小时加快执行速度的方法。 |
任务并行库 (TPL) | 提供任务并行库的概述。 |
并行编程 | 在 .NET Framework 中引入并行编程。 |