2010-01-19 5 views
7

최대 스레드 수를 10으로 설정 한 다음 ThreadPool.QueueUserWorkItem을 사용하여 22000 개의 작업을 추가했습니다. 프로그램을 실행 한 후에 22000 작업이 모두 완료되지 않았을 가능성이 큽니다. avaiable 쓰레드를 위해 얼마나 많은 작업을 대기시킬 수있는 제한이 있습니까?ThreadPool.QueueUserWorkItem의 최대 대기 요소 수

답변

6

대기열에는 실제 제한이 없지만 풀 자체는 64 대기 핸들 (즉, 총 스레드 활성화)을 초과하지 않습니다. documentation of ThreadPool에서

+0

버그는 내 문제를 일으켰지 만 기본적으로 질문에 대한 대답은 이것입니다. –

+0

감사합니다. 따라서 대기열 크기에 대한 유일한 실제 한계는 일반적인 대기열 (또는 이와 유사한) 객체 자체의 크기입니다. – matrixugly

+0

무엇? 150 개의 스레드 풀 스레드가 활성화되어 있습니다! – Vlad

4

:

참고 : 관리되는 스레드 풀에서 스레드는 백그라운드 스레드입니다. 즉, IsBackground 속성이 true입니다. 즉, ThreadPool 스레드는 모든 포 그라운드 스레드가 종료 된 후에도 응용 프로그램을 실행하지 않습니다.

모든 작업을 처리하기 전에 종료 할 수 있습니까?

4

이것은 구현에 따라 달라지는 질문이며이 기능의 구현이 조금씩 변경되었습니다. 하지만 .Net 4.0에서는 작업이 메모리 대기열에 저장되므로 시스템의 메모리 양에 의해 본질적으로 제한됩니다. 리플렉터에서 구현을 파헤쳐 보면 알 수 있습니다.

11

모든 작업이 처리 될 때까지 기다려야하는 경우 직접 처리해야합니다. ThreadPool 스레드는 모두 백그라운드 스레드이며 응용 프로그램을 유지하지 않습니다.

이것은 이러한 유형의 상황 처리 할 수있는 비교적 깨끗한 방법 : 당신이 그들을 수천이있는 경우 말했다되고 그건

using (var mre = new ManualResetEvent(false)) 
{ 
     int remainingToProcess = workItems.Count(); // Assuming workItems is a collection of "tasks" 
     foreach(var item in workItems) 
     { 
      // Delegate closure (in C# 4 and earlier) below will 
      // capture a reference to 'item', resulting in 
      // the incorrect item sent to ProcessTask each iteration. Use a local copy 
      // of the 'item' variable instead. 
      // C# 5/VS2012 will not require the local here. 
      var localItem = item; 
      ThreadPool.QueueUserWorkItem(delegate 
      { 
       // Replace this with your "work" 
       ProcessTask(localItem); 

       // This will (safely) decrement the remaining count, and allow the main thread to continue when we're done 
       if (Interlocked.Decrement(ref remainingToProcess) == 0) 
         mre.Set(); 
      }); 
     } 
     mre.WaitOne(); 
} 

, 그것은 일반적으로 "그룹"함께 작업 항목 더 나은, 그리고 스레드 풀에 대해 별도의 작업 항목으로 처리하지 마십시오. 이것은 항목 목록 관리와 관련된 일부 오버 헤드이며 한 번에 22000을 처리 할 수 ​​없으므로이를 블록으로 그룹화하는 것이 좋습니다. 하나의 작업 항목을 50 개 정도 처리하면 아마도 전체 처리량이 상당히 도움이 될 것입니다 ...

+0

좋은 생각이지만 앱이 모든 스레드를 기다리고있었습니다. 그룹화 또한 매우 좋은 제안입니다. –

관련 문제