[c#] ThreadPool.QueueUserWorkItem 대 Task.Factory.StartNew

아래의 차이점은 무엇입니까

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

위의 코드가 장시간 실행되는 작업에 대해 500 번 호출되면 모든 스레드 풀 스레드가 사용된다는 의미입니까?

아니면 TPL (두 번째 옵션)이 프로세서 수보다 적거나 같은 스레드를 차지할만큼 똑똑할까요?



답변

TPL을 사용하여 장기 실행 작업을 시작하려면을 지정해야 합니다. 이는 스레드 풀에서 예약 하지 않음TaskCreationOptions.LongRunning 을 의미합니다 . (편집 :로 댓글에서 언급 한, 이것은 이다 스케줄러 – 특정 결정하고, 단단하고 빠른 것은 아닙니다,하지만 난 어떤 합리적인 생산 스케줄러가 스레드 풀에서 장기 실행 작업을 예약하지 않도록 할 수 있기를 바랍니다 것입니다.)

스레드 풀에서 많은 수의 장기 실행 작업을 직접 예약해서는 안됩니다. 요즘 쓰레드 풀의 기본 크기는 꽤 크다고 생각합니다 (이런 방식으로 자주 악용되기 때문에).하지만 근본적으로 이렇게 사용해서는 안됩니다.

스레드 풀의 요점 은 실제로 실행되는 시간과 비교하여 새 스레드를 만드는 데 큰 타격을받는 짧은 작업 을 피하는 것 입니다. 작업이 오랫동안 실행되는 경우 새 스레드를 만드는 데 따른 영향은 상대적으로 적을 것이며 잠재적으로 스레드 풀 스레드가 부족 해지는 것을 원하지 않습니다. (지금은 덜하지만 나는 .NET 이전 버전의 경험을.)

개인적으로 옵션이 있다면 TaskAPI가 꽤 좋다는 이유로 TPL을 확실히 사용할 것입니다. 하지만 작업이 오랫동안 실행될 것으로 예상한다고 TPL에 알려주는 것을 잊지 마십시오 .

편집 : 의견에서 언급했듯이 TPL과 스레드 풀 중 선택 에 대한 PFX 팀의 블로그 게시물도 참조하십시오 .

결론적으로 CLR 팀의 ThreadPool 개발자가 이미 언급 한 내용을 반복하겠습니다.

Task is now the preferred way to queue work to the thread pool.

편집 : 또한 의견에서 TPL을 사용하면 사용자 정의 스케줄러 를 사용할 수 있음을 잊지 마십시오 .


답변