-2

我查看了微软关于 MSDN 上的任务的教程......它显示的内容很好,但我仍然有问题在那里的例子......在这个 URL 找到:MSDN Link

他们展示了一个示例,其中展示了 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),
4

2 回答 2

1

看起来像这样的重载

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.
于 2012-10-31T14:36:01.107 回答
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>的,因此不一定是数组。

于 2012-10-31T14:37:31.290 回答