참조 문서 : MSDN Task Parallelism (Task Parallel Library)
함께 읽어보면 도움 되는 자료 링크 : http://blog.powerumc.kr/175?category=206843
개인적으로 멀티 작업 처리를 할 때 자주 쓰는 패턴이다.
모든 상황에 병렬처리가 꼭 좋은 성능을 발휘하는건 아니므로 상황에 따라 적절히 사용하는게 좋다.
using System.Threading.Tasks; using System.Collections.Concurrent; Object _lockObject = new Object(); // READ OR WRITE DATA List<object> _testObject = new List<object>(); ..... // PATTERN Task task = Task.Factory.StartNew(() => { int maxWorkingCount = _testObject.Count; int workingRangeSize = 1; int processedCount = 0; // 논리 프로세스 수량 만큼 쓰레드 생성 if (maxWorkingCount > Environment.ProcessorCount) { workingRangeSize = maxWorkingCount / Environment.ProcessorCount; } var part = Partitioner.Create(0, maxWorkingCount, workingRangeSize); Parallel.ForEach(part, (num, state) => { for (int i = num.Item1; i < num.Item2; i++) { // 처리하고자 하는 데이터 읽기 object currentData = _testObject[i]; // 현재 처리 수량 processedCount++; // 만약 처리 데이터를 한곳에 모으고 싶다면 lock을 사용 lock(_lockObject) { // 예제 object processedObject = Process(currentData); _testObject.Add(processedObject); } }// END FOR }); }); // 이 부분은 필요에 따라 작성하던.. 안하던.. try { // 처리가 완료 될때 까지 대기 task.Wait(); // 후 처리 영역 } catch (AggregateException ex) { // 쓰레드 영역 예외 } catch(Exception ex) { // 후 처리 예외 } .....