10

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

MSDN 페이지에서작업 스케줄러그래서 질문ThreadPool 외부에서 스레드를 만들지 않도록되도록 오래 실행되는 작업을 최대한 피하는 것이 가장 좋습니다. 그러나 다음과 같이 완료하는 데 오랜 시간이 걸리는 작업을 수행했다고 가정 해보십시오.

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

작고 빠른 작업 단위로 작업을 분할하고 다음과 같이 작업 계속을 사용할 수 있습니까?

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

이 접근법이 더 유익 할 것인가 아니면 달성하려고 시도하는 것이 과잉인가?


  • 그것은 당신이 의미하는 바에 달려 있습니다.. - user703016

2 답변


5

최대한 오래 실행되는 작업을 피하는 것이 가장 좋습니다.

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

작고 빠른 작업 단위로 작업을 분할 해보십시오.

할 수 있다면 해보십시오. 그러나 타크스는 그렇게 쉽게 분리되어 있지 않습니다.


  • 나는 모든 알고리즘이 아주 작은 덩어리로 쉽게 분할 될 수있는 것은 아니라는 점에 동의한다. 하지만 할 수 있다면 그렇게하는 것이 낫겠습니까? 스케줄러가 다른 스레드를 생성하는 것보다 TPL을 더 잘 활용할 것이라고 추측합니다. 맞습니까? - Peter Monks
  • 더 좋을 수도 있지만 확실하지는 않습니다. 나는 보통 너무 많이 신경 쓰지 않을 것이다. 여분의 스레드로 연결되는지 알 수 없습니다 (가능하지 않음). - Henk Holterman

3

지정한 경우TaskCreationOptions.LongRunning대부분 스레드 풀 외부에서 전용 스레드를 할당합니다.

나는 단순히 장기 실행 작업이 스레드 풀에서 스레드 대신 별도의 전용 스레드에서 실행되도록하는 BackgroundWorker 클래스를 제안합니다.


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

연결된 질문


관련된 질문

최근 질문