참조 문서 : 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)
{
// 후 처리 예외
}
.....