ThreadPool.QueueUserWorkItem 대 Task.Factory.StartNew


79

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

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

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

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

답변:


93

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을 사용하면 사용자 정의 스케줄러 를 사용할 수 있음을 잊지 마십시오 .


4
나는 TaskCreationOptions.LongRunning항상 쓰레드 풀을 피할 엄격한 빠른 규칙을 경계 합니다. 구현 보증 이라기보다는 지시에 가깝습니다. 나는 그것에 근거하지 않습니까?
Marc

1
@Marc : 음, 스케줄러에 달려 있지만 스레드 풀인 IMO에서 명시 적으로 장기 실행 작업을 예약하는 것은 꽤 미친 스케줄러입니다.
Jon Skeet 2012


@Brad : 감사합니다. 내 답변에 대한 링크를 추가합니다.
Jon Skeet

1
또한 TPL을 사용하면 동시성을 제어 할 수있는 사용자 지정 스케줄러를 포함하여 고유 한 스케줄러를 지정할 수 있습니다. msdn.microsoft.com/en-us/library/ee789351.aspx
Chris Shain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.