web-dev-qa-db-ja.com

C#で3つのメソッドを並行して実行する最も簡単な方法

次のようないくつかの数値計算を実行するために呼び出す3つのメソッドがあります

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

各関数は互いに独立しており、デッドロックなしで並行して計算できます。
3つすべてが完了するまで、包含メソッドを終了せずに並列でこれらを計算する最も簡単な方法は何ですか?

60
PlTaylor

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

EDIT:すべてのアクションの実行が終了すると、呼び出しは戻ります。 Invoke() は、それらが実際に並列に実行されることを保証するものではなく、アクションが実行される順序を保証するものでもありません。

110
Sander Rijken

タスクでこれを行うこともできます(後でキャンセルまたは結果のようなものが必要な場合はもっと)

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);
18
Carsten

互いに独立した並列メソッドを実行するには、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

3
nvivekgoyal

.NET 4では、この種の問題を処理するように設計されたタスクパラレルライブラリを導入しました。 。NET Frameworkでのパラレルプログラミング を参照してください。

2
Shiraz Bhaiji
var task1 = SomeLongRunningTask();
var task2 = SomeOtherLongRunningTask();

await Task.WhenAll(task1, task2);

Task.WaitAllに対するこの利点は、スレッドを解放し、2つのタスクの完了を待つことです。

0
Brett Mealor