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

C# 在C中并行运行三个方法的最简单方法#,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,我调用了三种方法来进行数字运算,如下所示 results.LeftFront.CalcAi(); results.RightFront.CalcAi(); results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness); 每个函数相互独立,可以并行计算,没有死锁。 在所有三个都完成之前,在不使用包含方法的情况下并行计算这些值的最简单方法是什么?请参

我调用了三种方法来进行数字运算,如下所示

results.LeftFront.CalcAi();  
results.RightFront.CalcAi();  
results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness);
每个函数相互独立,可以并行计算,没有死锁。
在所有三个都完成之前,在不使用包含方法的情况下并行计算这些值的最简单方法是什么?

请参阅。他们列出了这个样本:

Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
因此,在您的情况下,这应该是可行的:

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

EDIT:所有操作执行完毕后,调用返回。is不能保证它们确实并行运行,也不能保证操作的执行顺序。

您也可以对任务执行此操作(如果以后需要取消或类似结果,则更好)


在.NET 4中,Microsoft引入了旨在处理此类问题的任务并行库,请参见。

以运行相互独立的并行方法。也可以使用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);
}
publicstaticvoidexecuteparallel(参数操作[]任务)
{
//初始化重置事件以跟踪已完成的线程
ManualResetEvent[]resetEvents=新的ManualResetEvent[tasks.Length];
//在它自己的线程中启动每个方法
for(int i=0;i
{
int taskIndex=(int)索引;
//执行该方法
任务[任务索引]();
//告诉呼叫线程我们完成了
resetEvents[taskIndex].Set();
}),i);
}
//等待所有线程执行
WaitHandle.WaitAll(重置事件);
}
有关此功能的更多详细信息,请参见此处:


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

您只对任务并行库解决方案感兴趣吗?那么直接的Delegate.BeginInvoke()甚至Thread.Start()呢?他想等待所有结果-你可以按照你的建议来做,但必须自己做同步-我想你应该使用Task,只要没有真正好的理由不这样做-如果C#/async启动,这将变得更加重要我发现的所有线程启动示例都不会等到函数组完成。不,它们不要这样做,你真的应该使用任务库来处理这类事情。IMHO MS正在用async推动这种方法,它真的是一个很好的库(几乎和F#的async工作流一样好:D)这会等到所有并行任务完成吗?对于我所做的所有搜索,似乎大多数人都忽略了这个简单的例子。谢谢你的快速回复和很好的回答。@Jonathan等待。该构造类似于启动多个任务,然后调用
Task.WaitAll
。如何从不同的方法获取返回值使用start new可能不是一个好主意请参见:()@dotnenja true now-这个答案非常古老(如您所见)-当时没有异步-无论如何,您可以按照您提供的链接的建议将其切换为-考虑到您可能会使用。net4.5(或更新版本)我这里有类似的东西<代码>并行还使用当前线程执行操作,因此它不会阻塞等待操作完成的线程。如果您有需要并行化的同步、CPU限制的操作,那么它是一个更好的选择。
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);
}
var task1 = SomeLongRunningTask();
var task2 = SomeOtherLongRunningTask();

await Task.WhenAll(task1, task2);