通过


Parallel.ForEach 方法

定义

在 Visual Basic 中执行foreachFor Each ), 其中迭代可以并行运行。

重载

名称 说明
ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

使用 IEnumerable 上的线程本地数据执行 foreachFor Each Visual Basic)操作,在其中可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

在 Visual Basic 中使用线程本地数据和 64 位 <索引执行 /> ( >)操作,在该操作中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(Partitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

使用 Partitioner 上的线程本地数据执行 foreach /> (For Each Visual Basic),在其中可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

使用 64 位索引 Visual Basic执行 foreachFor Each)操作,并在OrderablePartitioner<TSource>上执行线程本地数据,在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

在 Visual Basic 中使用线程本地 <数据执行 /> ( >)操作,其中迭代可以并行运行,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

在 Visual Basic 中使用线程本地 <数据执行 /> ( >) 操作,其中迭代可以并行运行,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(Partitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

使用 上的线程本地数据执行 /> ()操作,在该操作中可以并行运行迭代,并且可以监视和操作循环的状态。

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

使用 OrderablePartitioner<TSource> 上的线程本地数据执行 foreach /> (For Each Visual Basic),在其中可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource>)

在 Visual Basic IEnumerable 上执行 foreach /> (For Each)操作,在其中可以配置并行运行的迭代和循环选项。

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

对 Visual Basic IEnumerable 执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource>(OrderablePartitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

在 Visual Basic OrderablePartitioner<TSource> 上执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource>)

Partitioner 上对Partitioner执行foreach (Visual Basic For Each),可以配置循环选项。

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

在 Visual Basic 中执行具有 64 位 <索引的 /> ( >)操作,在该操作中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource>(Partitioner<TSource>, Action<TSource,ParallelLoopState>)

在 Visual BasicPartitioner上执行foreach /> (For Each)操作,在其中可以并行运行迭代,并且可以监视和操作循环的状态。

ForEach<TSource>(Partitioner<TSource>, Action<TSource>)

在 Visual Basic Partitioner 上对Partitioner执行foreachFor Each),其中迭代可以并行运行。

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState,Int64>)

在 Visual Basic IEnumerable 上执行具有 64 位索引的 foreach />(For Each),其中迭代可以并行运行,并且可以监视和操作循环的状态。

ForEach<TSource>(OrderablePartitioner<TSource>, Action<TSource,ParallelLoopState,Int64>)

在 Visual Basic OrderablePartitioner<TSource> 上执行 foreach /> (For Each)操作,在该操作中可以并行运行迭代,并且可以监视和操作循环的状态。

ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)

在 Visual Basic IEnumerable 上对IEnumerable执行foreachFor Each),其中迭代可以并行运行。

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

在 Visual Basic Partitioner 上执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState>)

对 Visual BasicIEnumerableFor Each)操作执行foreach/>,可以监视和操作循环的状态。

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

使用 IEnumerable 上的线程本地数据执行 foreachFor Each Visual Basic)操作,在其中可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : seq<'Source> * System.Threading.Tasks.ParallelOptions * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As IEnumerable(Of TSource), parallelOptions As ParallelOptions, localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

TLocal

线程本地数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

包含在所有线程上引发的所有单个异常的异常。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前中断循环的实例,以及一些本地状态,这些状态可能在在同一线程上执行的迭代之间共享。

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 线程调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic 中使用线程本地数据和 64 位 <索引执行 /> ( >)操作,在该操作中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, long, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : seq<'Source> * System.Threading.Tasks.ParallelOptions * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, int64, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As IEnumerable(Of TSource), parallelOptions As ParallelOptions, localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, Long, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

TLocal

线程本地数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

包含在所有线程上引发的所有单个异常的异常。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前突破循环的实例、当前元素的索引(Int64)和一些本地状态,这些状态可能在在同一线程上执行的迭代之间共享。

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 线程调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(Partitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

使用 Partitioner 上的线程本地数据执行 foreach /> (For Each Visual Basic),在其中可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * System.Threading.Tasks.ParallelOptions * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As Partitioner(Of TSource), parallelOptions As ParallelOptions, localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

TLocal

线程本地数据的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

SupportsDynamicPartitions返回false或分区程序中的Partitionersource属性返回null分区。

包含在所有线程上引发的所有单个异常的异常。

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 ForEach 要求自定义分区程序支持动态分区。 此重载适用于可能受益于静态范围分区的小型循环主体的方案。 分区程序必须支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 任务调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

使用 64 位索引 Visual Basic执行 foreachFor Each)操作,并在OrderablePartitioner<TSource>上执行线程本地数据,在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::OrderablePartitioner<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, long, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Concurrent.OrderablePartitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : System.Collections.Concurrent.OrderablePartitioner<'Source> * System.Threading.Tasks.ParallelOptions * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, int64, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As OrderablePartitioner(Of TSource), parallelOptions As ParallelOptions, localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, Long, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

TLocal

线程本地数据的类型。

参数

source
OrderablePartitioner<TSource>

包含原始数据源的可排序分区程序。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

-或-

localInitlocalFinally参数为 null.

SupportsDynamicPartitions返回false或分区程序中的Partitionersource属性返回null分区。

包含在所有线程上引发的所有单个异常的异常。

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个线程上的最后一个正文调用返回传递给 localFinally 委托的状态值。 每个 localFinally 任务调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic 中使用线程本地 <数据执行 /> ( >)操作,其中迭代可以并行运行,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Generic.IEnumerable<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : seq<'Source> * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As IEnumerable(Of TSource), localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

TLocal

线程本地数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

包含在所有线程上引发的所有单个异常的异常。

示例

以下示例演示如何使用 ForEach 具有本地状态的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class ForEachWithThreadLocal
{
    // Demonstrated features:
    // 		Parallel.ForEach()
    //		Thread-local state
    // Expected results:
    //      This example sums up the elements of an int[] in parallel.
    //      Each thread maintains a local sum. When a thread is initialized, that local sum is set to 0.
    //      On every iteration the current element is added to the local sum.
    //      When a thread is done, it safely adds its local sum to the global sum.
    //      After the loop is complete, the global sum is printed out.
    // Documentation:
    //		http://msdn.microsoft.com/library/dd990270(VS.100).aspx
    static void Main()
    {
        // The sum of these elements is 40.
        int[] input = { 4, 1, 6, 2, 9, 5, 10, 3 };
        int sum = 0;

        try
        {
            Parallel.ForEach(
                    input,					        // source collection
                    () => 0,					        // thread local initializer
                    (n, loopState, localSum) =>		// body
                    {
                        localSum += n;
                        Console.WriteLine("Thread={0}, n={1}, localSum={2}", Thread.CurrentThread.ManagedThreadId, n, localSum);
                        return localSum;
                    },
                    (localSum) => Interlocked.Add(ref sum, localSum)					// thread local aggregator
                );

            Console.WriteLine("\nSum={0}", sum);
        }
        // No exception is expected in this example, but if one is still thrown from a task,
        // it will be wrapped in AggregateException and propagated to the main thread.
        catch (AggregateException e)
        {
            Console.WriteLine("Parallel.ForEach has thrown an exception. THIS WAS NOT EXPECTED.\n{0}", e);
        }
    }
}
Imports System.Threading
Imports System.Threading.Tasks

Module ForEachDemo

    ' Demonstrated features:
    '   Parallel.ForEach()
    '   Thread-local state
    ' Expected results:
    '   This example sums up the elements of an int[] in parallel.
    '   Each thread maintains a local sum. When a thread is initialized, that local sum is set to 0.
    '   On every iteration the current element is added to the local sum.
    '   When a thread is done, it safely adds its local sum to the global sum.
    '   After the loop is complete, the global sum is printed out.
    ' Documentation:
    '   http://msdn.microsoft.com/library/dd990270(VS.100).aspx
    Private Sub ForEachDemo()
        ' The sum of these elements is 40.
        Dim input As Integer() = {4, 1, 6, 2, 9, 5, _
        10, 3}
        Dim sum As Integer = 0

        Try
            ' source collection
            Parallel.ForEach(input,
                             Function()
                                 ' thread local initializer
                                 Return 0
                             End Function,
                             Function(n, loopState, localSum)
                                 ' body
                                 localSum += n
                                 Console.WriteLine("Thread={0}, n={1}, localSum={2}", Thread.CurrentThread.ManagedThreadId, n, localSum)
                                 Return localSum
                             End Function,
                             Sub(localSum)
                                 ' thread local aggregator
                                 Interlocked.Add(sum, localSum)
                             End Sub)

            Console.WriteLine(vbLf & "Sum={0}", sum)
        Catch e As AggregateException
            ' No exception is expected in this example, but if one is still thrown from a task,
            ' it will be wrapped in AggregateException and propagated to the main thread.
            Console.WriteLine("Parallel.ForEach has thrown an exception. THIS WAS NOT EXPECTED." & vbLf & "{0}", e)
        End Try
    End Sub


End Module

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前中断循环的实例,以及一些本地状态,这些状态可能在在同一线程上执行的迭代之间共享。

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 线程调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic 中使用线程本地 <数据执行 /> ( >) 操作,其中迭代可以并行运行,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, long, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Generic.IEnumerable<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : seq<'Source> * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, int64, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As IEnumerable(Of TSource), localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, Long, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

TLocal

线程本地数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

包含在所有线程上引发的所有单个异常的异常。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前突破循环的实例、当前元素的索引(Int64)和一些本地状态,这些状态可能在在同一线程上执行的迭代之间共享。

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 任务调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(Partitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

使用 上的线程本地数据执行 /> ()操作,在该操作中可以并行运行迭代,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Concurrent.Partitioner<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As Partitioner(Of TSource), localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

TLocal

线程本地数据的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

SupportsDynamicPartitions返回false或分区程序中的Partitionersource属性返回null分区。

包含在所有线程上引发的所有单个异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

localInit 参与循环执行的每个线程调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 任务调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

使用 OrderablePartitioner<TSource> 上的线程本地数据执行 foreach /> (For Each Visual Basic),在其中可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource, typename TLocal>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::OrderablePartitioner<TSource> ^ source, Func<TLocal> ^ localInit, Func<TSource, System::Threading::Tasks::ParallelLoopState ^, long, TLocal, TLocal> ^ body, Action<TLocal> ^ localFinally);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal>(System.Collections.Concurrent.OrderablePartitioner<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);
static member ForEach : System.Collections.Concurrent.OrderablePartitioner<'Source> * Func<'Local> * Func<'Source, System.Threading.Tasks.ParallelLoopState, int64, 'Local, 'Local> * Action<'Local> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource, TLocal) (source As OrderablePartitioner(Of TSource), localInit As Func(Of TLocal), body As Func(Of TSource, ParallelLoopState, Long, TLocal, TLocal), localFinally As Action(Of TLocal)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

TLocal

线程本地数据的类型。

参数

source
OrderablePartitioner<TSource>

包含原始数据源的可排序分区程序。

localInit
Func<TLocal>

返回每个任务的本地数据的初始状态的函数委托。

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

每次迭代调用一次的委托。

localFinally
Action<TLocal>

对每个任务的本地状态执行最终操作的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

-或-

参数 localInitnull.

-或-

参数 localFinallynull.

SupportsDynamicPartitions返回false或分区程序中的Partitionersource属性返回null分区。

包含在所有线程上引发的所有单个异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

对于 localInit 参与循环执行的每个任务,将调用一次委托,并返回每个任务的初始本地状态。 这些初始状态将传递到每个任务的第一个 body 调用。 然后,每个后续的正文调用都会返回一个可能修改的状态值,该值传递给下一个正文调用。 最后,每个任务的最后一个正文调用将返回传递给 localFinally 委托的状态值。 每个 localFinally 任务调用一次委托,对每个任务的本地状态执行最终操作。 可以在多个任务上并发调用此委托;因此,必须同步对任何共享变量的访问。

当现有任务完成并被新任务替换时,该方法 Parallel.ForEach 可能在其执行生存期内使用的任务数多于线程。 这样,基础 TaskScheduler 对象就有机会添加、更改或删除服务循环的线程。

适用于

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic IEnumerable 上执行 foreach /> (For Each)操作,在其中可以配置并行运行的迭代和循环选项。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource> body);
static member ForEach : seq<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

parallelOptions参数CancellationToken中已取消

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

注解

body 可枚举中的每个 source 元素调用一次委托。 它以当前元素作为参数提供。

适用于

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

对 Visual Basic IEnumerable 执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource, System::Threading::Tasks::ParallelLoopState ^> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);
static member ForEach : seq<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source, System.Threading.Tasks.ParallelLoopState> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource, ParallelLoopState)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource,ParallelLoopState>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

parallelOptions参数CancellationToken中已取消

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素,以及 ParallelLoopState 可用于过早中断循环的实例。

适用于

ForEach<TSource>(OrderablePartitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic OrderablePartitioner<TSource> 上执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::OrderablePartitioner<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource, System::Threading::Tasks::ParallelLoopState ^, long> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.OrderablePartitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);
static member ForEach : System.Collections.Concurrent.OrderablePartitioner<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source, System.Threading.Tasks.ParallelLoopState, int64> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As OrderablePartitioner(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource, ParallelLoopState, Long)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
OrderablePartitioner<TSource>

包含原始数据源的可排序分区程序。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource,ParallelLoopState,Int64>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

parallelOptions参数CancellationToken中已取消

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

SupportsDynamicPartitions可排序分区程序中的source属性返回 false

-或-

KeysNormalized可排序分区程序中的source属性返回 false

-或-

在可排序分区程序返回null的任何方法source时引发的异常。

引发以包含从其中一个指定委托引发的异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

Partitioner 上对Partitioner执行foreach (Visual Basic For Each),可以配置循环选项。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource> body);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As Partitioner(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

分区 SupportsDynamicPartitions 程序中的 source 属性返回 false

-或-

当分区程序中的任何方法返回null时引发的source异常。

引发以包含从其中一个指定委托引发的异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic 中执行具有 64 位 <索引的 /> ( >)操作,在该操作中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource, System::Threading::Tasks::ParallelLoopState ^, long> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);
static member ForEach : seq<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source, System.Threading.Tasks.ParallelLoopState, int64> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource, ParallelLoopState, Long)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource,ParallelLoopState,Int64>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

parallelOptions参数CancellationToken中已取消

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前突破循环的实例和当前元素的索引(Int64)。

适用于

ForEach<TSource>(Partitioner<TSource>, Action<TSource,ParallelLoopState>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual BasicPartitioner上执行foreach /> (For Each)操作,在其中可以并行运行迭代,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, Action<TSource, System::Threading::Tasks::ParallelLoopState ^> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.Partitioner<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * Action<'Source, System.Threading.Tasks.ParallelLoopState> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As Partitioner(Of TSource), body As Action(Of TSource, ParallelLoopState)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

body
Action<TSource,ParallelLoopState>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

分区 SupportsDynamicPartitions 程序中的 source 属性返回 false

-或-

分区程序中的 source 方法返回 null

-或-

GetPartitions(Int32)分区程序中的source方法不返回正确的分区数。

引发以包含从其中一个指定委托引发的异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(Partitioner<TSource>, Action<TSource>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic Partitioner 上对Partitioner执行foreachFor Each),其中迭代可以并行运行。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, Action<TSource> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.Partitioner<TSource> source, Action<TSource> body);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * Action<'Source> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As Partitioner(Of TSource), body As Action(Of TSource)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

body
Action<TSource>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

分区 SupportsDynamicPartitions 程序中的 source 属性返回 false

-或-

当分区程序中的任何方法返回null时引发的source异常。

-或-

GetPartitions(Int32)分区程序中的source方法不返回正确的分区数。

引发以包含从其中一个指定委托引发的异常的异常。

示例

以下示例演示如何实现用于 Parallel.ForEach的区域分区程序:

using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

class RangePartitionerDemo 
{
        static void Main()
        {
            Stopwatch sw = null;

            long sum = 0;
            long SUMTOP = 10000000;

            // Try sequential for
            sw = Stopwatch.StartNew();
            for (long i = 0; i < SUMTOP; i++) sum += i;
            sw.Stop();
            Console.WriteLine("sequential for result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for -- this is slow!
            //sum = 0;
            //sw = Stopwatch.StartNew();
            //Parallel.For(0L, SUMTOP, (item) => Interlocked.Add(ref sum, item));
            //sw.Stop();
            //Console.WriteLine("parallel for  result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for with locals
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.For(0L, SUMTOP, () => 0L, (item, state, prevLocal) => prevLocal + item, local => Interlocked.Add(ref sum, local));
            sw.Stop();
            Console.WriteLine("parallel for w/locals result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try range partitioner
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.ForEach(Partitioner.Create(0L, SUMTOP), (range) =>
            {
                long local = 0;
                for (long i = range.Item1; i < range.Item2; i++) local += i;
                Interlocked.Add(ref sum, local);
            });
            sw.Stop();
            Console.WriteLine("range partitioner result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);
        }
}
Imports System.Collections.Concurrent
Imports System.Threading
Imports System.Threading.Tasks

Module RangePartitionerDemo

    Sub Main()
        Dim sw As Stopwatch = Nothing

        Dim sum As Long = 0
        Dim SUMTOP As Long = 10000000

        ' Try sequential for
        sw = Stopwatch.StartNew()
        For i As Long = 0 To SUMTOP - 1
            sum += i
        Next
        sw.Stop()
        Console.WriteLine("sequential for result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds)

        ' Try parallel for with locals
        sum = 0
        sw = Stopwatch.StartNew()
        Parallel.For(0L, SUMTOP, Function() 0L, Function(item, state, prevLocal) prevLocal + item, Function(local) Interlocked.Add(sum, local))
        sw.Stop()
        Console.WriteLine("parallel for w/locals result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds)

        ' Try range partitioner
        sum = 0
        sw = Stopwatch.StartNew()
        Parallel.ForEach(Partitioner.Create(0L, SUMTOP),
                         Sub(range)
                             Dim local As Long = 0
                             For i As Long = range.Item1 To range.Item2 - 1
                                 local += i
                             Next
                             Interlocked.Add(sum, local)
                         End Sub)
        sw.Stop()
        Console.WriteLine("range partitioner result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds)
    End Sub

End Module

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState,Int64>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic IEnumerable 上执行具有 64 位索引的 foreach />(For Each),其中迭代可以并行运行,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, Action<TSource, System::Threading::Tasks::ParallelLoopState ^, long> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);
static member ForEach : seq<'Source> * Action<'Source, System.Threading.Tasks.ParallelLoopState, int64> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), body As Action(Of TSource, ParallelLoopState, Long)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

body
Action<TSource,ParallelLoopState,Int64>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素、 ParallelLoopState 可用于提前突破循环的实例和当前元素的索引(Int64)。

适用于

ForEach<TSource>(OrderablePartitioner<TSource>, Action<TSource,ParallelLoopState,Int64>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic OrderablePartitioner<TSource> 上执行 foreach /> (For Each)操作,在该操作中可以并行运行迭代,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::OrderablePartitioner<TSource> ^ source, Action<TSource, System::Threading::Tasks::ParallelLoopState ^, long> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.OrderablePartitioner<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);
static member ForEach : System.Collections.Concurrent.OrderablePartitioner<'Source> * Action<'Source, System.Threading.Tasks.ParallelLoopState, int64> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As OrderablePartitioner(Of TSource), body As Action(Of TSource, ParallelLoopState, Long)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
OrderablePartitioner<TSource>

包含原始数据源的可排序分区程序。

body
Action<TSource,ParallelLoopState,Int64>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

SupportsDynamicPartitions可排序分区程序中的source属性返回 false

-或-

KeysNormalized 可排序分区器中的属性返回 false

-或-

源可排序分区程序中的任何方法返回 null

从其中一个指定委托引发的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic IEnumerable 上对IEnumerable执行foreachFor Each),其中迭代可以并行运行。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, Action<TSource> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, Action<TSource> body);
static member ForEach : seq<'Source> * Action<'Source> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), body As Action(Of TSource)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

body
Action<TSource>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

示例

以下示例使用 ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) 该方法计算文本文件中元音和非空格字符的数量。 在这种情况下, ParallelLoopResult 将忽略该方法返回的值。 请注意,由于操作可以并行运行,因此必须确保递增计数器变量是原子操作,并且多个线程不会同时尝试访问计数器变量。 为此,此示例使用 lock 语句(以 C#为单位)和 SyncLock 语句(Visual Basic)。

using System;
using System.IO;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task<String> task = ReadCharacters(@".\CallOfTheWild.txt");
      String text = task.Result;
      
      int nVowels = 0;
      int nNonWhiteSpace = 0;
      Object obj = new Object();

      ParallelLoopResult result = Parallel.ForEach(text, 
                                                   (ch) => {
                                                      Char uCh = Char.ToUpper(ch);
                                                      if ("AEIOUY".IndexOf(uCh) >= 0) {
                                                         lock (obj) {
                                                            nVowels++;
                                                         }
                                                      }
                                                      if (!Char.IsWhiteSpace(uCh)) {
                                                         lock (obj) {
                                                            nNonWhiteSpace++;
                                                         }   
                                                      }
                                                   } );
      Console.WriteLine("Total characters:      {0,10:N0}", text.Length);
      Console.WriteLine("Total vowels:          {0,10:N0}", nVowels);
      Console.WriteLine("Total non-white-space:  {0,10:N0}", nNonWhiteSpace);
   }

   private static async Task<String> ReadCharacters(String fn)
   {
      String text;
      using (StreamReader sr = new StreamReader(fn)) {
         text = await sr.ReadToEndAsync();
      }
      return text;
   }
}
// The example displays output like the following:
//       Total characters:         198,548
//       Total vowels:              58,421
//       Total non-white-space:     159,461
Imports System.IO
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim task As Task(Of String) = ReadCharacters(".\CallOfTheWild.txt")
      Dim text As String = task.Result
      
      Dim nVowels As Integer = 0
      Dim nNonWhiteSpace As Integer = 0
      Dim obj As New Object()

      Dim result As ParallelLoopResult = Parallel.ForEach(text, 
                                                          Sub(ch)
                                                             Dim uCh As Char = Char.ToUpper(ch)
                                                             If "AEIOUY".IndexOf(uCh) >= 0 Then
                                                                SyncLock obj
                                                                   nVowels += 1
                                                                End SyncLock
                                                             End If
                                                             If Not Char.IsWhiteSpace(uCh) Then
                                                                SyncLock obj
                                                                   nNonWhiteSpace += 1
                                                                End SyncLock   
                                                             End If
                                                          End Sub)
      Console.WriteLine("Total characters:      {0,10:N0}", text.Length)
      Console.WriteLine("Total vowels:          {0,10:N0}", nVowels)
      Console.WriteLine("Total non-white space:  {0,10:N0}", nNonWhiteSpace)
   End Sub
   
   Private Async Function ReadCharacters(fn As String) As Task(Of String)
      Dim text As String
      Using sr As New StreamReader(fn)
         text = Await sr.ReadToEndAsync()
      End Using
      Return text
   End Function
End Module
' The output from the example resembles the following:
'       Total characters:         198,548
'       Total vowels:              58,421
'       Total non-white space:     159,461

注解

body 可枚举中的每个 source 元素调用一次委托。 它以当前元素作为参数提供。

适用于

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

在 Visual Basic Partitioner 上执行 foreach /> (For Each),在其中可以并行运行迭代,可以配置循环选项,并且可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Concurrent::Partitioner<TSource> ^ source, System::Threading::Tasks::ParallelOptions ^ parallelOptions, Action<TSource, System::Threading::Tasks::ParallelLoopState ^> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);
static member ForEach : System.Collections.Concurrent.Partitioner<'Source> * System.Threading.Tasks.ParallelOptions * Action<'Source, System.Threading.Tasks.ParallelLoopState> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As Partitioner(Of TSource), parallelOptions As ParallelOptions, body As Action(Of TSource, ParallelLoopState)) As ParallelLoopResult

类型参数

TSource

source元素的类型。

参数

source
Partitioner<TSource>

包含原始数据源的分区程序。

parallelOptions
ParallelOptions

一个对象,用于配置此操作的行为。

body
Action<TSource,ParallelLoopState>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数CancellationTokenparallelOptions中已取消。

CancellationTokenSource 释放与 CancellationTokenparallelOptions 关联的对象。

参数 sourcenull.

-或-

参数 parallelOptionsnull.

-或-

参数 bodynull.

分区 SupportsDynamicPartitions 程序中的 source 属性返回 false

-或-

当分区程序中的任何方法返回null时引发的source异常。

引发以包含从其中一个指定委托引发的异常的异常。

注解

此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 该方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 以及 如何:实现动态分区

适用于

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState>)

Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs
Source:
Parallel.cs

对 Visual BasicIEnumerableFor Each)操作执行foreach/>,可以监视和操作循环的状态。

public:
generic <typename TSource>
 static System::Threading::Tasks::ParallelLoopResult ForEach(System::Collections::Generic::IEnumerable<TSource> ^ source, Action<TSource, System::Threading::Tasks::ParallelLoopState ^> ^ body);
public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);
static member ForEach : seq<'Source> * Action<'Source, System.Threading.Tasks.ParallelLoopState> -> System.Threading.Tasks.ParallelLoopResult
Public Shared Function ForEach(Of TSource) (source As IEnumerable(Of TSource), body As Action(Of TSource, ParallelLoopState)) As ParallelLoopResult

类型参数

TSource

源中的数据的类型。

参数

source
IEnumerable<TSource>

可枚举数据源。

body
Action<TSource,ParallelLoopState>

每次迭代调用一次的委托。

返回

包含有关循环哪个部分已完成的信息的结构。

例外

参数 sourcenull.

-或-

参数 bodynull.

包含在所有线程上引发的所有单个异常的异常。

注解

body 可枚举中的每个 source 元素调用一次委托。 它提供以下参数:当前元素,以及 ParallelLoopState 可用于过早中断循环的实例。

适用于