21

LongRunning 옵션을 사용하여 작업을 만든 경우 ThreadPool을 사용하지 않으므로 부작용이 있습니다.


3 답변


16

. 부작용은 다음과 같습니다.백만 개의 작업이 있다면 백만 개의 스레드를 만들 수 있습니다.

각각의 스레드가 해당 스레드를 가져올 것을 고려해야합니다.메모리 오버 헤드컨텍스트 스위칭 오버 헤드.메모리 오버 헤드가 그렇게 작지는 않습니다.몇 MB여기 수천 개의 항목이 있더라도 문제가 발생할 수 있습니다.


26

그만큼LongRunning옵션은 그것을 의미하는 스케줄러에 대한 힌트입니다.할 수있다실행을 선택하십시오.TaskThreadPool이 아닌 스레드에서 (스레드 풀이 지원되는 경우DefaultScheduler가장 가능성이 높습니다). 한 가지 부작용이LongRunning옵션은 해당 작업에 대해 작업 인라이닝이 허용되지 않는다는 것입니다. 즉,LongRunning작업이 다른 중첩 또는 하위 작업 및 호출을 만듭니다.Wait이러한 작업 중 하나에 대해서는 인라인되지 않고 다른 스레드에서 항상 실행됩니다 (즉, 동일한 스레드에서Wait).

다른 사람들의 답변과 관련하여 완료하는 데 오랜 시간이 걸리는 많은 수의 작업을 만드는 것이 중요합니다.없이그만큼LongRunning힌트는 스레드 삽입 알고리즘으로 인해 스레드 수가 점차 증가 할 가능성이 있습니다.DefaultScheduler사용. 알고리즘은 차단 된 풀의 스레드와 오랫동안 작업 항목을 실행 한 스레드를 구분하지 않으며 두 경우 모두 작업 처리량을 높이기 위해 더 많은 스레드를 풀에 주입하여 응답 할 수 있습니다.


  • Reflectoring은 .NET 4.0의 힌트가 항상 준수된다는 것을 보여줍니다. - usr

5

LongRunning 작업은 전역 큐와 로컬 큐가 무시되어 로컬 큐에있는 다른 스레드를 차단하지 못하게합니다.

즉, 이러한 장기 실행 작업이 많은 경우 정상보다 많은 스레드가 생성 될 수 있습니다.

이 질문에 대한 답에서 몇 가지 단점을 볼 수 있습니다.

http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/8304b44f-0480-488c-93a4-ec419327183b


  • 약간 더 명확하게 업데이트되었습니다 (MSDN에서 말하는 인라인과 더 잘 어울립니다) - Holger

연결된 질문


관련된 질문

최근 질문