2012-01-30 3 views
10

내가하고있는 작업 프로젝트의 작업 병렬 라이브러리 사용법을 연구 중이며 장시간 실행되는 작업의 장점/단점을 이해하고 싶습니다. 나는 실생활에 대한 예를 아직 가지고 있지 않다. 단지 이것에 대한 이론을 이해하고 싶다.작업 병렬 라이브러리 - LongRunning 작업 대 여러 개의 연속 작업

MSDN 페이지의 내용은 task schedulers 및이 SO question에서 가능한 한 오래 실행되는 작업을 피하는 것이 가장 좋습니다. 그러면 ThreadPool 외부에서 스레드를 만들지 않는 것이 좋습니다. 하지만 그 대신이, 당신이 완료하는 데 시간이 오래 걸릴 거라고 작업이 한 말 :

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

당신이 시도하고, 작은으로 작업의 빠른 단위 작업을 분할과 같은 작업의 연속 요청을 사용할 수 이 :

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

이 방법이 더 효과적 일 수 있습니까? 아니면 달성하려는 목표에 과도한 영향을 줄 수 있습니까?

+0

정말 * long *이 무슨 뜻인지에 달려 있습니다. –

답변

5
그것을 피하기 위해 최선 것처럼 보이는 것

가능하면 많은 장기 실행 작업

전적으로 맞지 않습니다. 필요하다면 어떻게 든 스레드를 만들거나 할당해야하고 LongRunning 옵션이있는 태스크가 아마도 최선의 선택 일 것입니다. 플래그는 단순히 스케줄러에게 태스크가 예상 할 수 있도록 잠시 걸릴 수 있음을 알려줍니다. 이 옵션을 무시할 수도 있습니다.

당신은 시도하고 작업 할 수있는 경우, 다음을 수행합니다

의 작은, 빨리 단위로 작업을 분할 수 없습니다. 그러나 타크스는 그렇게 쉽게 분리되어 있지 않습니다.

+0

모든 알고리즘이 작은 덩어리로 쉽게 분할 될 수있는 것은 아닙니다. 하지만 할 수 있다면 그렇게하는 것이 낫겠습니까? 나는 TPL을 다른 스레드를 만드는 스케줄러보다 잘 활용할 것이라고 추측하고있다. 맞습니까? –

+0

더 좋을 수도 있지만 확실하지 않습니다. 나는 보통 너무 많이 신경 쓰지 않을 것이다. 여분의 스레드로 연결되는지 여부를 알 수 없습니다. –

3

TaskCreationOptions.LongRunning을 지정하면 주로 스레드 풀 외부에서 전용 스레드가 할당됩니다.

나는 단순히 장기 실행 작업 대신 스레드 풀의 스레드의 별도의 전용 스레드에서 실행됩니다 확인합니다 BackgroundWorker에 클래스에 갈 제안

+1

TaskCreationOptions.LongRunning은 대개 전용 스레드를 생성합니다. – dtb

관련 문제