Le moyen le plus simple d’exécuter trois méthodes en parallèle dans C #

J’ai trois méthodes que j’appelle pour faire quelques calculs qui sont comme suit

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

Chacune des fonctions est indépendante les unes des autres et peut être calculée en parallèle sans verrou mort.
Quelle est la manière la plus simple de les calculer en parallèle sans que la méthode contenant finisse jusqu’à ce que tous les trois soient terminés?

Voir la documentation TPL . Ils listent cet échantillon:

 Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork()); 

Donc, dans votre cas, cela devrait fonctionner:

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

EDIT: L’appel retourne après que toutes les actions ont fini de s’exécuter. Invoke() ne garantit pas leur exécution en parallèle et ne garantit pas l’ordre dans lequel les actions s’exécutent.

Vous pouvez le faire avec des tâches aussi (plus agréable si vous avez plus tard besoin d’une annulation ou quelque chose du genre)

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

Dans .NET 4, Microsoft a introduit la bibliothèque parallèle de tâches conçue pour gérer ce type de problème, voir Programmation parallèle dans le .NET Framework .

Pour exécuter des méthodes parallèles indépendantes les unes des autres, ThreadPool.QueueUserWorkItem peut également être utilisé. Voici la méthode d’échantillon-

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

Plus de détails sur cette fonction peuvent être trouvés ici:
http://newapputil.blogspot.in/2016/03/running-parallel-tasks-using.html

 var task1 = SomeLongRunningTask(); var task2 = SomeOtherLongRunningTask(); await Task.WhenAll(task1, task2); 

L’avantage de ceci sur Task.WaitAll est que cela libère le thread et attend l’achèvement des deux tâches.