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

我有三个方法,我调用来做一些数字处理,如下所示

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

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

117159 次浏览

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

在.NET4中,微软引入了任务并行库,它是为处理这类问题而设计的,参见 .NET 框架下的并行编程

运行相互独立的 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);
}

关于这个函数的更多细节可以在这里找到:
Http://newapputil.blogspot.in/2016/03/running-parallel-tasks-using.html

var task1 = SomeLongRunningTask();
var task2 = SomeOtherLongRunningTask();


await Task.WhenAll(task1, task2);

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