최대 스레드 수를 10으로 설정 한 다음 ThreadPool.QueueUserWorkItem을 사용하여 22000 개의 작업을 추가했습니다. 프로그램을 실행 한 후에 22000 작업이 모두 완료되지 않았을 가능성이 큽니다. avaiable 쓰레드를 위해 얼마나 많은 작업을 대기시킬 수있는 제한이 있습니까?ThreadPool.QueueUserWorkItem의 최대 대기 요소 수
답변
대기열에는 실제 제한이 없지만 풀 자체는 64 대기 핸들 (즉, 총 스레드 활성화)을 초과하지 않습니다. documentation of ThreadPool에서
:
참고 : 관리되는 스레드 풀에서 스레드는 백그라운드 스레드입니다. 즉, IsBackground 속성이 true입니다. 즉, ThreadPool 스레드는 모든 포 그라운드 스레드가 종료 된 후에도 응용 프로그램을 실행하지 않습니다.
모든 작업을 처리하기 전에 종료 할 수 있습니까?
이것은 구현에 따라 달라지는 질문이며이 기능의 구현이 조금씩 변경되었습니다. 하지만 .Net 4.0에서는 작업이 메모리 대기열에 저장되므로 시스템의 메모리 양에 의해 본질적으로 제한됩니다. 리플렉터에서 구현을 파헤쳐 보면 알 수 있습니다.
모든 작업이 처리 될 때까지 기다려야하는 경우 직접 처리해야합니다. 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 개 정도 처리하면 아마도 전체 처리량이 상당히 도움이 될 것입니다 ...
좋은 생각이지만 앱이 모든 스레드를 기다리고있었습니다. 그룹화 또한 매우 좋은 제안입니다. –
- 1. + (id) arrayWithObjects에 대한 최대 요소 수 :
- 2. IRP_MJ_WRITE 대기 시간 최대 15 초
- 3. Swing에서 새 하위 구성 요소 수신 대기
- 4. 톰캣 대기 요청 수 측정
- 5. STL 세트에서 최대 요소 지우기
- 6. 최대 절전 모드 구성 요소
- 7. 부모 대기 스레드 대기
- 8. HTML 문서의 최대 요소 수 또는 파일 크기는 얼마입니까?
- 9. 최대 절전 모드 매핑에서 구성 요소 내의 구성 요소
- 10. FloatBuffer에있는 요소 수 결정
- 11. 최대 및 최대 클릭 수
- 12. 최대 수
- 13. 페이지에 넣을 요소 ID의 최대 수는 얼마입니까?
- 14. NSArray (또는 NSMutableArray)의 최대 요소 찾기
- 15. 속성 및 최대 길이 제한이있는 XSD 요소
- 16. 응답 대기 중 대기 화면
- 17. ThreadPool.QueueUserWorkItem의 정보를 UI 스레드로 다시 전달하는 방법은 무엇입니까?
- 18. 요소 집합에서 최대 및 최소 동시 일치
- 19. 최대 절전 모드 잠금 대기 시간 초과가 초과되었습니다.
- 20. time.sleep and suspend (예 : 대기 및 최대 절전 모드)
- 21. 대기 모드 및 최대 절전 모드를 취소하는 방법은 무엇입니까?
- 22. .NET Windows 서비스에서 시스템 대기/절전/최대 절전 모드를 감지합니까?
- 23. C 윈도우에서 대기중인 대기 시간없이 대기
- 24. MySQL, 인덱스 및 "대기 대기 시간 초과"
- 25. 스레딩 - 대기()
- 26. Proxool 최대 연결 수
- 27. PDF의 최대 객체 수
- 28. 문자열의 최대 문자 수
- 29. IE8의 최대 div 수
- 30. ListBox의 최대 항목 수
버그는 내 문제를 일으켰지 만 기본적으로 질문에 대한 대답은 이것입니다. –
감사합니다. 따라서 대기열 크기에 대한 유일한 실제 한계는 일반적인 대기열 (또는 이와 유사한) 객체 자체의 크기입니다. – matrixugly
무엇? 150 개의 스레드 풀 스레드가 활성화되어 있습니다! – Vlad