C# 병렬 ( Parallel ) 처리 패턴

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

.....

 

 

  • 2017년 12월 5일