Thread.Join на несколько потоков с таймаутом - PullRequest
2 голосов
/ 02 ноября 2009

У меня есть массив потоков, и я хочу присоединить их всех с тайм-аутом (т. Е. Посмотреть, все ли они закончились в течение определенного тайм-аута). Я ищу что-то эквивалентное WaitForMultipleObjects или способ передачи дескрипторов потока в WaitHandle.WaitAll, но я не могу найти ничего в BCL, который делает то, что я хочу.

Я, конечно, могу перебрать все потоки (см. Ниже), но это означает, что для полной функции может потребоваться время ожидания * threads.Count для возврата.

private Thread[] threads;

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

Ответы [ 3 ]

5 голосов
/ 02 ноября 2009

Я предлагаю вам сначала проработать «время паузы», а затем перебрать потоки, используя разницу между текущим временем и временем «паузы»:

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;
}
4 голосов
/ 02 ноября 2009

Но в этом цикле вы можете уменьшить значение тайм-аута:

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;
}
2 голосов
/ 02 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...