使用Parallel.Invoke执行带参数的方法

时间:2012-04-22 21:15:46

标签: c#-4.0 action parallel-processing

我已经定义了一个Action<string, int, double, double>数组,并希望使用Parallel.Invoke()并行执行它们。有什么方法可以将我的Action转换为无参数动作,以便我可以做到这一点还是有另一种方式?

2 个答案:

答案 0 :(得分:5)

你可以试试这个:

Parallel.Invoke(() =>
    {
        YourFirstAction(param1, param2, param3, param4);
    },  // close first Action
    () =>
    {
        YourSecondAction(param1, param2, param3, param4);
    }//close second Action
); //close parallel.invoke

答案 1 :(得分:1)

如果你在没有发送参数值的情况下执行它们,那么我很困惑为什么动作有参数。最好将Parallel.ForEach与默认值一起使用:

Action<string, int, double, double>[] actions;

// Action array, actions, set somewhere in code.

Parallel.ForEach(actions, action => action(string.Empty, 0, 0, 0));

如果要发送参数,请根据需要替换值。

我在测试中使用了以下操作:

Parallel.For(0, actions.Length, index => actions[index] = (s, i, d1, d2) => Thread.Sleep(100));
Parallel.For(0, parameterless.Length, index => parameterless[index] = () => Thread.Sleep(100));

长度为20秒的数组的结果:

Parallel.Invoke:0.3000709

Parallel.ForEach:0.3022143

常规循环:2.0000706

所以Parallel.Invoke确实具有使用无参数动作的优势,这会对性能产生轻微影响,但影响不大。

为了解决问题,我使用Parallel.ForEach测试了无参数的Action数组,结果与Parallel.Invoke的结果大致相同,结果为0.300979秒。