2011-10-27 2 views
21

LongRunning 옵션을 사용하여 작업을 만들면 ThreadPool을 사용하지 않아 부작용이 발생합니다.작업 LongRunning 부작용?

+0

http://stackoverflow.com/questions/3105988/task-parallel-library-taskcreationoptions-longrunning-option-and-threadpool 브라우저에 질문 제목을 입력하면 자동 완성 작업이 수행됩니까? :) –

+0

나는 그것을 발견했다! http://msdn.microsoft.com/en-us/library/dd997402.aspx – Aliostad

답변

16

합니다. 부작용은 다음과 같습니다. 백만 개의 작업이 있으면 백만 개의 스레드가 생성 될 수 있습니다.

각 스레드 오버 헤드 스위칭 오버 헤드 및 상황을 그 메모리를 가져올 것이다 고려해야 할 필요가있다. 메모리 오버 헤드가 작지 않습니다. 우리는 몇 메가 바이트입니다. 그래서 수천 개의 항목이 있어도 문제가 발생할 수 있습니다.

5

LongRunning 작업은 글로벌 및 로컬 대기열이 무시되어 다른 대기열을 막지 않도록 지정합니다 스레드가 로컬 큐에서 처리됩니다.

즉, 이러한 장기 실행 작업이 많으면 일반적인 것보다 많은 스레드가 생성 될 수 있습니다.

당신은이 질문에 대한 답변에서 단점 중 일부를 볼 수 있습니다

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

+0

조금 더 명확하게 업데이트되었습니다. (MSDN이 말하는 것보다 더 많이 인라인됩니다) – Holger

26

LongRunning 옵션은 (그것의 경우 스레드 풀은 가능성이 가장 높은 것입니다 DefaultScheduler을 백업)이 비 스레드 풀 스레드에서 Task을 실행하도록 선택할 수 있습니다 의미 스케줄러에 대한 힌트입니다. LongRunning 옵션의 부작용 중 하나는 해당 작업에 대해 작업 인라이닝이 허용되지 않는다는 것입니다. 즉, LongRunning 작업이 다른 중첩 또는 하위 작업을 만들고 해당 작업에서 Wait을 호출하면 인라인되지 않고 다른 스레드에서 항상 실행됩니다 (즉, Wait을 수행하는 동일한 스레드에서 실행 됨). 그것은 시간이 오래 걸릴 작업의 큰 숫자를 생성하는 것은 LongRunning 힌트가 여전히 스레드의 수가 에스컬레이션을 일으킬 수 없이 완료 할 것을 언급하는 것은 가치가 다른 사람의 답변의 맥락에서

인해 스레드 DefaultScheduler이 사용하는 주입 알고리즘. 알고리즘은 차단 된 풀의 스레드와 오랫동안 작업 항목을 실행 한 스레드를 구분하지 않으며 두 경우 모두 작업 처리량을 높이기 위해 더 많은 스레드를 풀에 주입하여 응답 할 수 있습니다.

+7

Reflectoring은 .NET 4.0 이후로, 항상 복종한다. – usr