LongRunning 옵션을 사용하여 작업을 만든 경우 ThreadPool을 사용하지 않으므로 부작용이 있습니다.
예. 부작용은 다음과 같습니다.백만 개의 작업이 있다면 백만 개의 스레드를 만들 수 있습니다.
각각의 스레드가 해당 스레드를 가져올 것을 고려해야합니다.메모리 오버 헤드과컨텍스트 스위칭 오버 헤드.메모리 오버 헤드가 그렇게 작지는 않습니다.몇 MB여기 수천 개의 항목이 있더라도 문제가 발생할 수 있습니다.
그만큼LongRunning
옵션은 그것을 의미하는 스케줄러에 대한 힌트입니다.할 수있다실행을 선택하십시오.Task
ThreadPool이 아닌 스레드에서 (스레드 풀이 지원되는 경우DefaultScheduler
가장 가능성이 높습니다). 한 가지 부작용이LongRunning
옵션은 해당 작업에 대해 작업 인라이닝이 허용되지 않는다는 것입니다. 즉,LongRunning
작업이 다른 중첩 또는 하위 작업 및 호출을 만듭니다.Wait
이러한 작업 중 하나에 대해서는 인라인되지 않고 다른 스레드에서 항상 실행됩니다 (즉, 동일한 스레드에서Wait
).
다른 사람들의 답변과 관련하여 완료하는 데 오랜 시간이 걸리는 많은 수의 작업을 만드는 것이 중요합니다.없이그만큼LongRunning
힌트는 스레드 삽입 알고리즘으로 인해 스레드 수가 점차 증가 할 가능성이 있습니다.DefaultScheduler
사용. 알고리즘은 차단 된 풀의 스레드와 오랫동안 작업 항목을 실행 한 스레드를 구분하지 않으며 두 경우 모두 작업 처리량을 높이기 위해 더 많은 스레드를 풀에 주입하여 응답 할 수 있습니다.
LongRunning 작업은 전역 큐와 로컬 큐가 무시되어 로컬 큐에있는 다른 스레드를 차단하지 못하게합니다.
즉, 이러한 장기 실행 작업이 많은 경우 정상보다 많은 스레드가 생성 될 수 있습니다.
이 질문에 대한 답에서 몇 가지 단점을 볼 수 있습니다.