我有三种方法可以执行一些数字运算,如下所示
results.LeftFront.CalcAi();
results.RightFront.CalcAi();
results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness);
每个函数都是相互独立的,可以并行计算,没有死锁 在完成所有这三项工作之前,如果没有包含方法,那么最简单的并行计算方法是什么?
答案 0 :(得分:108)
请参阅TPL documentation。他们列出了这个样本:
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()
并不保证它们确实会并行运行,也不保证动作的执行顺序。
答案 1 :(得分: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);
答案 2 :(得分:2)
在.NET 4中,Microsoft引入了旨在处理此类问题的任务并行库,请参阅Parallel Programming in the .NET Framework。
答案 3 :(得分:2)
要运行彼此独立的并行方法,也可以使用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
答案 4 :(得分:0)
var task1 = SomeLongRunningTask();
var task2 = SomeOtherLongRunningTask();
await Task.WhenAll(task1, task2);
这比Task.WaitAll的好处是,这将释放线程并等待两个任务的完成。