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()
并不保证它们确实会并行运行,也不保证动作执行的顺序.
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)