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

时间:2012-10-31 14:28:41

标签: c# .net multithreading parallel-extensions

我查看了微软关于MSDN上的任务的教程......这对它显示的内容很有帮助,但我仍然有问题在这个例子中...在这个网址找到:MSDN Link

他们展示了一个示例,其中显示了Parallel.ForEach()静态方法调用。在该方法调用中,它们有四个参数...第一个参数是否必须是Ints数组?或者它可能是所有线程正在处理的任何类型的集合或对象?看起来第二个参数是一个Action,它是一个不返回值(或void)的委托。那第二个变量到底是什么?线程本地初始化器?为什么初始化为0?这到底是怎么回事?第3个参数只是一个委托(或者我喜欢用它来考虑的功能点)是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),

2 个答案:

答案 0 :(得分:1)

看起来像this overload

public static ParallelLoopResult ForEach<TSource, TLocal>(
    IEnumerable<TSource> source,
    Func<TLocal> localInit,
    Func<TSource, ParallelLoopState, TLocal, TLocal> body,
    Action<TLocal> localFinally
)

你有:

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.

答案 1 :(得分:0)

第二个参数是Action<int>,它类似于普通的foreach循环体。使用Parallel.ForEach的最简单方法是双参数重载:

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

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

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