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