Parallel.ForEach 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中可能会并行运行迭代。
重载
ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
parallelOptions
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
包含在所有线程上引发的全部单个异常的异常。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它提供以下参数:current 元素、可用于过早中断循环的实例,以及在同一 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
执行具有线程本地数据和 64 位索引的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
parallelOptions
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
包含在所有线程上引发的全部单个异常的异常。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它提供以下参数:current 元素、可用于过早中断循环的实例、当前元素的索引 (Int64) ,以及可在同一ParallelLoopState线程上执行的迭代之间共享的一些本地状态。
对于参与循环执行的每个任务,将 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
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 上可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
parallelOptions
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
source
Partitioner 中的 SupportsDynamicPartitions 属性返回 false
,或者分区程序返回 null
分区。
包含在所有线程上引发的全部单个异常的异常。
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能会受益于对范围进行分区。 方法 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
foreach
使用 64 位索引和线程本地数据OrderablePartitioner<TSource>在 Visual Basic) 操作中执行 (For Each
,其中迭代可以并行运行,可以配置循环选项,并且可以监视和操作循环的状态。
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
线程本地数据的类型。
参数
包含原始数据源的可排序分区程序。
- parallelOptions
- ParallelOptions
一个对象,用于配置此操作的行为。
- localInit
- Func<TLocal>
用于返回每个任务的本地数据的初始状态的函数委托。
- body
- Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>
将为每个迭代调用一次的委托。
- localFinally
- Action<TLocal>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
parallelOptions
参数为 null
。
或
body
参数为 null
。
- 或 -
localInit
或 localFinally
参数为 null
。
source
Partitioner 中的 SupportsDynamicPartitions 属性返回 false
,或者分区程序返回 null
分区。
包含在所有线程上引发的全部单个异常的异常。
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能会受益于对范围进行分区。 方法 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
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
包含在所有线程上引发的全部单个异常的异常。
示例
以下示例演示如何使用 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
次。 它提供以下参数:current 元素、可用于提前中断循环的实例,以及可在同一 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
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
包含在所有线程上引发的全部单个异常的异常。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它提供以下参数:current 元素、可用于过早中断循环的实例、当前元素的索引 (Int64) ,以及可在同一ParallelLoopState线程上执行的迭代之间共享的一些本地状态。
对于参与循环执行的每个任务,将 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
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 上可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
source
Partitioner 中的 SupportsDynamicPartitions 属性返回 false
,或者分区程序返回 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
执行具有线程本地数据的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 OrderablePartitioner<TSource> 上可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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
线程本地数据的类型。
参数
包含原始数据源的可排序分区程序。
- localInit
- Func<TLocal>
用于返回每个任务的本地数据的初始状态的函数委托。
- body
- Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>
将为每个迭代调用一次的委托。
- localFinally
- Action<TLocal>
用于对每个任务的本地状态执行一个最终操作的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
source
参数为 null
。
或
body
参数为 null
。
或
localInit
参数为 null
。
或
localFinally
参数为 null
。
source
Partitioner 中的 SupportsDynamicPartitions 属性返回 false
,或者分区程序返回 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
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 中可能会并行运行迭代,而且可以匹配配置循环选项。
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参数。
包含在所有线程上引发的全部单个异常的异常。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它与当前元素一起作为参数提供。
另请参阅
适用于
ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 中可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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参数。
包含在所有线程上引发的全部单个异常的异常。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它提供以下参数:当前元素,以及 ParallelLoopState 可用于过早中断循环的 实例。
另请参阅
适用于
ForEach<TSource>(OrderablePartitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 OrderablePartitioner<TSource> 中可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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
中的元素的类型。
参数
包含原始数据源的可排序分区程序。
- parallelOptions
- ParallelOptions
一个对象,用于配置此操作的行为。
- body
- Action<TSource,ParallelLoopState,Int64>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 parallelOptions
取消的 CancellationToken参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
在 source
可排序的分区程序的 SupportsDynamicPartitions 属性返回 false
。
- 或 -
在 source
可排序的分区程序的 KeysNormalized 属性返回 false
。
- 或 -
当 source
可排序分区程序中的任何方法返回 null
时引发的异常。
因包含从指定的委托之一引发的异常而引发的异常。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 如何:实现动态分区。
另请参阅
适用于
ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 中可能会并行运行迭代,而且可以配置循环选项。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
因包含从指定的委托之一引发的异常而引发的异常。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能受益于对范围进行分区。 方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 如何:实现动态分区。
另请参阅
适用于
ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行具有 64 位索引的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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参数。
包含在所有线程上引发的全部单个异常的异常。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
注解
对 body
可枚举中的每个元素调用委托 source
一次。 它提供以下参数:current 元素、 ParallelLoopState 可用于提前中断循环的实例,以及当前元素的索引 (Int64) 。
另请参阅
适用于
ForEach<TSource>(Partitioner<TSource>, Action<TSource,ParallelLoopState>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 中可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 source
的分区程序的 SupportsDynamicPartitions 属性返回 false
。
- 或 -
source
分区程序中的方法返回 null
。
- 或 -
source
分区程序中的 GetPartitions(Int32) 方法未返回正确的分区数时引发的异常。
因包含从指定的委托之一引发的异常而引发的异常。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能会受益于对范围进行分区。 方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 如何:实现动态分区。
另请参阅
适用于
ForEach<TSource>(Partitioner<TSource>, Action<TSource>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 上可能会并行运行迭代。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 source
的分区程序的 SupportsDynamicPartitions 属性返回 false
。
- 或 -
在 source
分区程序中的任何方法返回 null
时引发的异常。
- 或 -
source
分区程序中的 GetPartitions(Int32) 方法未返回正确的分区数时引发的异常。
因包含从指定的委托之一引发的异常而引发的异常。
示例
以下示例演示如何实现用于 的范围分区程序 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
执行具有 64 位索引的 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
包含在所有线程上引发的全部单个异常的异常。
注解
委托 body
将针对可枚举中的每个元素调用一 source
次。 它提供以下参数:current 元素、 ParallelLoopState 可用于过早中断循环的实例,以及当前元素的索引 (Int64) 。
另请参阅
适用于
ForEach<TSource>(OrderablePartitioner<TSource>, Action<TSource,ParallelLoopState,Int64>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 OrderablePartitioner<TSource> 中可能会并行运行迭代,而且可以监视和操作循环的状态。
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
中的元素的类型。
参数
包含原始数据源的可排序分区程序。
- body
- Action<TSource,ParallelLoopState,Int64>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 source
可排序的分区程序的 SupportsDynamicPartitions 属性返回 false
。
- 或 -
在 false
可排序的分区程序的 KeysNormalized 属性返回 。
- 或 -
在源可排序的分区程序的所有方法都返回 null
。
从其中某个指定委托引发的异常。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能会受益于对范围进行分区。 方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 如何:实现动态分区。
另请参阅
适用于
ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 上可能会并行运行迭代。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
包含在所有线程上引发的全部单个异常的异常。
示例
以下示例使用 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
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 Partitioner 中可能会并行运行迭代,而且可以配置循环选项,可以监视和操作循环的状态。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
在 parallelOptions
取消的 CancellationToken 参数。
在 parallelOptions
中与 CancellationTokenSource 关联的 CancellationToken 已被释放。
因包含从指定的委托之一引发的异常而引发的异常。
注解
此重载适用于要重写默认分区方案的方案。 例如,小型循环主体可能会受益于对范围进行分区。 方法 Parallel.ForEach 要求自定义分区程序支持动态分区。 有关详细信息,请参阅 PLINQ 和 TPL 的自定义分区程序 和 如何:实现动态分区。
另请参阅
适用于
ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState>)
- Source:
- Parallel.cs
- Source:
- Parallel.cs
- Source:
- Parallel.cs
执行 foreach
(在 Visual Basic 中为 For Each
)操作,其中在 IEnumerable 中可能会并行运行迭代,而且可以监视和操作循环的状态。
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>
将为每个迭代调用一次的委托。
返回
包含有关已完成的循环部分的信息的结构。
例外
包含在所有线程上引发的全部单个异常的异常。
注解
委托 body
将针对可枚举中的每个元素调用一 source
次。 它提供以下参数:current 元素,以及 ParallelLoopState 可用于过早中断循环的实例。