64 스레드 이상의 가능한 모든 스레드가 작업을 완료 할 때까지 기다릴 기본 스레드가 필요한 시나리오가 있습니다. 그 때문에 다음 도우미를 작성했습니다 유틸리티이 유틸리티 방법으로멀티 스레딩 - 모든 스레드가 신호를받을 때까지 기다림
public static void WaitAll(WaitHandle[] handles)
{
if (handles == null)
throw new ArgumentNullException("handles",
"WaitHandle[] handles was null");
foreach (WaitHandle wh in handles) wh.WaitOne();
}
(WaitHandle.WaitAll()
에서 64 WaitHandle이 한계를 회피하기 위해) 그 효과에 동기하므로, 그러나 각 WaitHandle이 단지 조사 배열의 모든 선행 한 ... 시그널링 한 후 , waithandles가 autoResetEvent wait 핸들 인 경우 작동하지 않습니다 (대기중인 스레드가 해제 되 자마자 지워짐)
이 문제를 해결하려면이 코드를 다음과 같이 변경하는 것을 고려하고 있지만 다른 사람들이 확인하여 작동하는지, 누군가가 문제를 보거나 더 나은 방법을 제안 할 수 있는지 확인하고 싶습니다. 사전에
감사 :
public static void WaitAllParallel(WaitHandle[] handles)
{
if (handles == null)
throw new ArgumentNullException("handles",
"WaitHandle[] handles was null");
int actThreadCount = handles.Length;
object locker = new object();
foreach (WaitHandle wh in handles)
{
WaitHandle qwH = wh;
ThreadPool.QueueUserWorkItem(
delegate
{
try { qwH.WaitOne(); }
finally { lock(locker) --actThreadCount; }
});
}
while (actThreadCount > 0) Thread.Sleep(80);
}
정말로 64 개 이상의 스레드가 필요합니까? 이것은 약간 IMHO 냄새. – dtb
AutoResetEvent를 사용하는 방법과 이유를 더 자세히 설명 할 수 있습니까? 작업이 끝나면 스레드가 종료되지 않습니까? – dtb
개체를 잠그는 대신 Interlocked (http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx) 클래스를 사용하여 활성 작업자 수를 늘리거나 줄이는 것이 좋습니다. –