2009-11-02 4 views
2

스레드 배열이 있는데 시간 제한을 사용하여이 모든 스레드를 결합하려고합니다 (즉, 시간 제한 내에서 모두 완료되었는지 확인하십시오). WaitForMultipleObjects 또는 WaitHandle.WaitAll, 스레드 핸들을 전달하는 방법을 상응하는 뭔가 찾고 있는데,하지만 내가 원하는대로 않습니다 BCL 아무것도 찾을 수 없습니다.Thread.Join이 여러 스레드에서 시간 초과가 발생했습니다.

물론 모든 스레드를 반복 할 수 있지만 (아래 참조) 전체 기능이 시간 초과로 걸릴 수 있습니다. * threads.Count가 반환됩니다.

private Thread[] threads; 

public bool HaveAllThreadsFinished(Timespan timeout) 
{ 
    foreach (var thread in threads) 
    { 
     if (!thread.Join(timeout)) 
     { 
      return false; 
     }     
    } 
    return true; 
} 

답변

4

그러나이 루프 내에서 당신은 시간 제한 값을 줄일 수 있습니다 :

private Thread[] threads; 

public bool HaveAllThreadsFinished(Timespan timeout) 
{ 
    foreach (var thread in threads) 
    { 
     Stopwatch sw = Stopwatch.StartNew(); 
     if (!thread.Join(timeout)) 
     { 
      return false; 
     } 
     sw.Stop(); 
     timeout -= Timespan.FromMiliseconds(sw.ElapsedMiliseconds);     
    } 
    return true; 
} 
+0

나는이 일을해야 할 것이라고 생각했지만 이미 나를 위해 좋은 BCL 기능이있을 것으로 기대하고 있었다. –

5

를 참조하십시오 현재 시간과 원래 드롭 데드 타임의 차이를 사용하여 스레드 수 :

private Thread[] threads; 

public bool HaveAllThreadsFinished(TimeSpan timeout) 
{ 
    DateTime end = DateTime.UtcNow + timeout; 

    foreach (var thread in threads) 
    { 
     timeout = end - DateTime.UtcNow; 

     if (timeout <= TimeSpan.Zero || !thread.Join(timeout)) 
     { 
      return false; 
     }     
    } 

    return true; 
} 
관련 문제