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

时间:2011-09-06 13:13:50

标签: c# parallel-processing task-parallel-library

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

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

每个函数都是相互独立的,可以并行计算,没有死锁 在完成所有这三项工作之前,如果没有包含方法,那么最简单的并行计算方法是什么?

5 个答案:

答案 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的好处是,这将释放线程并等待两个任务的完成。