비동기 작업 또는 병렬처리 프로그래밍은 대량성 작업에는 필수적인 요소입니다.

실무프로젝트에서, 대량푸시 관련된 작업이 있었는데, 닷넷 4.0에 추가된 Parallel Extension 을 사용하면서, 쉽게 작업을

수행할수 있었습니다.


기존에는 Thread 또는 델리게이트를 통해  비동기 작업을 수행했습니다.

그러나, 닷넷 4.0에서는 Parallel Extension을  통해 비동기 작업을 쉽게 구성할 수 있고 개발자는 비즈니스로직에 집중할 수 있습니다.


##로드밸런싱##

for문을 통해 스레드를 계속 할당하게 되면(로드밸런싱), 100~300개 이상 생성되는것을 알수 있습니다. 

쓰레드가 많이 생성된다해서 더 빠른 작업을 수행하는것은 아닙니다.

오히려 쓰레드간에 컨텍스트 스위칭에 대한 비용이 발생되고, 오히려 속도가 저하되기도 합니다.


##구간분할##

C#에서는 작업의 분배전략을 통해, 스레드 갯수를 조절할 수 있습니다.  약 20~30개정도 매뉴얼로 할당한 후 작업을 

수행하게되면 원하는 결과를 얻을 수 있을것입니다.


#region Parallel 처리방식

/* 할당될 스레드 갯수 */
private readonly int MULTI_THREAD_COUNT = 20;

var task = Task.Factory.StartNew(() =>
{
   /* 1. 구간분할로 TASK를 나눔
	* 2. 스레드 최대개수는 App.Config에서 설정 가능
	* 3. 스레드가 너무 많으면, 리소스 할당 및 컨텍스트 스위칭으로 인한 비용이 많이 발생될 수 있다.
	* 4. 작업량이 적으면, 시퀀셜 처리방식 보다 느릴 가능성이 있다. (왜냐면, 3번과 같은 이유) 
	*/
	var maxWorkingCount = {데이터테이블}.Rows.Count;

	//작업량이 클때만, 구간분할 처리
	int workingRangeSize = 1;
	if (maxWorkingCount > 100)
	{
		workingRangeSize = maxWorkingCount / MULTI_THREAD_COUNT;
	}

	var part = Partitioner.Create(0, maxWorkingCount, workingRangeSize);

	Parallel.ForEach(part, (num, state) =>
	{
		for (int i = num.Item1; i < num.Item2; i++)
		{
			//TODO 데이터테이블 관련된 작업실행...
		}
	});
});

try
{
	task.Wait();

	Thread.Sleep(2000);
	MessageBox.Show("작업이 완료되었습니다.");

}
catch (AggregateException ae)
{
	// Will work
	foreach (var exception in ae.InnerExceptions)
	{
		if (exception is ArgumentNullException)
		{

		}
		else if (exception is IndexOutOfRangeException)
		{

		}
		else
		{

		}
	}
} 

#endregion


참고) http://vsts2010.tistory.com/668