在C#中并行运行三个方法的最简单方法

PlT*_*lor 66 c# parallel-processing task-parallel-library

我有三种方法可以做一些数字运算,如下所示

results.LeftFront.CalcAi();  
results.RightFront.CalcAi();  
results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness);
Run Code Online (Sandbox Code Playgroud)

每个函数彼此独立,并且可以并行计算而没有死锁.
在没有包含方法完成之前,并行计算这些内容的最简单方法是什么?

San*_*ken 116

请参阅TPL文档.他们列出了这个样本:

Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下这应该工作:

Parallel.Invoke(
    () => results.LeftFront.CalcAi(),
    () => results.RightFront.CalcAi(),
    () => results.RearSuspension.CalcAi(geom, 
                                        vehDef.Geometry.LTa.TaStiffness, 
                                        vehDef.Geometry.RTa.TaStiffness));
Run Code Online (Sandbox Code Playgroud)

编辑:所有操作完成执行后调用返回.Invoke()并不保证它们确实会并行运行,也不保证动作执行的顺序.

  • @Jonathan它会等.该构造类似于启动几个任务然后调用`Task.WaitAll`. (5认同)
  • 这会等到所有Parallel任务完成吗? (4认同)
  • 对于我所做的所有搜索,似乎大多数人都忽略了这个简单的例子.感谢您的快速反应和良好的答案. (2认同)

Car*_*ten 18

您也可以使用任务执行此操作(如果您以后需要取消或类似结果,则可以更好)

var task1 = Task.Factory.StartNew(() => results.LeftFront.CalcAi());
var task2 = Task.Factory.StartNew(() => results.RightFront.CalcAi());
var task3 = Task.Factory.StartNew(() =>results.RearSuspension.CalcAi(geom, 
                              vehDef.Geometry.LTa.TaStiffness, 
                              vehDef.Geometry.RTa.TaStiffness));

Task.WaitAll(task1, task2, task3);
Run Code Online (Sandbox Code Playgroud)

  • 可能不是一个好主意,使用start new see:(http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html) (6认同)
  • @dotNETNinja现在是真的 - 这个答案很老了(你可以看到) - 那时没有异步 - 无论如何你可以用[`Task.Run`]切换它(http://msdn.microsoft.com/en- us/library/hh195051(v = vs.110).aspx)由您提供的链接提供建议 - 假设您可以使用.net4.5(或更新版本) (3认同)