C #에서 세 가지 메서드를 병렬로 실행하는 가장 간단한 방법
다음과 같은 번호 처리를 위해 호출하는 세 가지 방법이 있습니다.
results.LeftFront.CalcAi();
results.RightFront.CalcAi();
results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness);
각 함수는 서로 독립적이며 데드락없이 병렬로 계산할 수 있습니다.
세 가지가 모두 완료 될 때까지 포함 메서드를 완료하지 않고 병렬로 이들을 계산하는 가장 쉬운 방법은 무엇입니까?
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));
편집 : 모든 작업 실행이 완료된 후 호출이 반환됩니다. Invoke()
실제로 병렬로 실행된다는 것을 보장하지 않으며 작업이 실행되는 순서도 보장하지 않습니다.
작업에서도이 작업을 수행 할 수 있습니다 (나중에 취소 또는 결과와 같은 것이 필요한 경우 더 좋음).
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);
서로 독립적 인 병렬 메서드를 실행하려면 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 에서 확인할 수 있습니다.
.NET 4에서 Microsoft는 이러한 종류의 문제를 처리하도록 설계된 Task Parallel Library를 도입했습니다 . .NET Framework의 병렬 프로그래밍을 참조하십시오 .
var task1 = SomeLongRunningTask();
var task2 = SomeOtherLongRunningTask();
await Task.WhenAll(task1, task2);
Task.WaitAll에 비해 이것의 이점은 스레드를 해제하고 두 작업의 완료를 기다린다는 것입니다.
참고 URL : https://stackoverflow.com/questions/7320491/simplest-way-to-run-three-methods-in-parallel-in-c-sharp
'IT박스' 카테고리의 다른 글
OCaml 또는 Haskell의 기계 학습? (0) | 2020.11.27 |
---|---|
필요한 경우 URL에 스키마 추가 (0) | 2020.11.27 |
루비 셀프 키워드 사용? (0) | 2020.11.26 |
'dotnet-aspnet-codegenerator'명령과 일치하는 실행 파일이 없습니다. " (0) | 2020.11.26 |
대소 문자를 구분하지 않는 문자열 비교 (0) | 2020.11.26 |