C# .net中的System.Threading.Task库特别是Parallel.ForEach

C# .net中的System.Threading.Task库特别是Parallel.ForEach,c#,.net,multithreading,parallel-extensions,C#,.net,Multithreading,Parallel Extensions,我看了微软关于MSDN任务的教程。。。这是很好的表现,但我仍然有问题在那里的例子。。。可在此URL找到: 它们显示了一个示例,其中显示了Parallel.ForEach()静态方法调用。在该方法调用中,它们有四个参数。。。第一个参数必须是整数数组吗?或者它可能是所有线程正在处理的任何类型的集合或对象?看起来第二个参数是一个Action,它是一个不返回值(或void)的委托。第二个变量到底是干什么的?线程本地初始化器?为什么要初始化为0?这里到底设置了什么?第三个参数只是一个委托(或者我喜欢用它来

我看了微软关于MSDN任务的教程。。。这是很好的表现,但我仍然有问题在那里的例子。。。可在此URL找到:

它们显示了一个示例,其中显示了Parallel.ForEach()静态方法调用。在该方法调用中,它们有四个参数。。。第一个参数必须是整数数组吗?或者它可能是所有线程正在处理的任何类型的集合或对象?看起来第二个参数是一个Action,它是一个不返回值(或void)的委托。第二个变量到底是干什么的?线程本地初始化器?为什么要初始化为0?这里到底设置了什么?第三个参数只是一个委托(或者我喜欢用它来思考的一个函数点),lambda表达式的右侧是实际的函数吗?例如,我可以把一个实际函数的名称放在那一边,而不必直接写出来吗?例如

    public int localSum(int n, ParallelLoopState loopState, int localSum) {
        localSum += n;
        Console.WriteLine("Thread={0}, n={1}, localSum={2}", Thread.CurrentThread.ManagedThreadId, n, localSum);
        return localSum;
    }

(n, loopState, localSum) => localSum(int n, ParallelLoopState loopState, int localSum),
看起来像:

公共静态并行循环结果ForEach(
IEnumerable来源,
Func localInit,
职能机构,
最后行动
)
如果您有:

Parameters

source
    Type: System.Collections.Generic.IEnumerable<TSource>

    An enumerable data source.

localInit
    Type: System.Func<TLocal>

    The function delegate that returns the initial state of the local data for each task.

body
    Type: System.Func<TSource, ParallelLoopState, TLocal, TLocal>

    The delegate that is invoked once per iteration.

localFinally
    Type: System.Action<TLocal>

    The delegate that performs a final action on the local state of each task.
参数
来源
类型:System.Collections.Generic.IEnumerable
可枚举的数据源。
局部化
类型:System.Func
返回每个任务的本地数据初始状态的函数委托。
身体
类型:System.Func
每次迭代调用一次的委托。
最后
类型:System.Action
对每个任务的本地状态执行最终操作的委托。

第二个参数是一个
动作
,它类似于普通的
foreach
循环体。使用
Parallel.ForEach
的最简单方法是两个参数重载:

Parallel.ForEach(myIntegers, i => loopBody(i));

// non-parallel equivalent
foreach(int i in myIntegers)
{
    loopBody(i);
}

myIntegers
可以是任何
IEnumerable
,因此不一定是数组。

您是否查看了
Parallel.ForEach
的文档?听起来它能回答你所有的问题…这是并行聚合,这里有详细介绍
Parallel.ForEach(myIntegers, i => loopBody(i));

// non-parallel equivalent
foreach(int i in myIntegers)
{
    loopBody(i);
}