5

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

4

2 回答 2

7

你可以试试这个:

Parallel.Invoke(() =>
    {
        YourFirstAction(param1, param2, param3, param4);
    },  // close first Action
    () =>
    {
        YourSecondAction(param1, param2, param3, param4);
    }//close second Action
); //close parallel.invoke
于 2012-04-26T22:10:13.693 回答
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 的数组的结果(以秒为单位):

并行调用:0.3000709

Parallel.ForEach:0.3022143

常规 for 循环:2.0000706

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

只是为了好玩,我使用 Parallel.ForEach 测试了无参数的 Action 数组,结果与 Parallel.Invoke 几乎相同,结果为 0.300979 秒。

于 2013-03-25T01:55:57.257 回答