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

我有三个方法,我打电话做一些数字计算,如下所示

results.LeftFront.CalcAi(); results.RightFront.CalcAi(); results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness); 

每个函数都是相互独立的,可以并行计算,没有死锁。
在没有包含方法的情况下,并行计算这些方法最简单的方法是什么?

请参阅TPL文档 。 他们列出了这个例子:

 Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork()); 

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

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

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

你也可以用任务做到这一点(更好,如果你以后需要取消或类似的结果)

 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); 

在.NET 4中,Microsoft推出了专为处理这类问题而devise的Task Parallel Library,参见.NET Framework中的并行编程 。

要运行相互独立的并行方法ThreadPool.QueueUserWorkItem也可以使用。 这里是示例方法 –

 public static void ExecuteParallel (params Action[] tasks) { // Initialize the reset events to keep track of completed threads ManualResetEvent [] resetEvents = new ManualResetEvent [tasks. Length]; // Launch each method in it's own thread for (int i = 0; i < tasks . Length; i ++) { resetEvents [i ] = new ManualResetEvent (false ); ThreadPool .QueueUserWorkItem ( new WaitCallback ((object index) => { int taskIndex = ( int) index ; // Execute the method tasks [taskIndex ](); // Tell the calling thread that we're done resetEvents [taskIndex ]. Set(); }), i ); } // Wait for all threads to execute WaitHandle .WaitAll ( resetEvents); } 

关于这个function的更多细节可以在这里find –
http://newapputil.blogspot.in/2016/03/running-parallel-tasks-using.html

 var task1 = SomeLongRunningTask(); var task2 = SomeOtherLongRunningTask(); await Task.WhenAll(task1, task2); 

这比Task.WaitAll的好处是,这将释放线程,并等待完成这两个任务。