Thread.Join на несколько потоков с таймаутом

2

У меня есть массив потоков, и я хочу объединить их всех с таймаутом (т.е. посмотреть, все ли они закончились за определенный тайм-аут). Я ищу что-то эквивалентное 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;
}
Теги:
multithreading

3 ответа

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;
}
2
if(!thread.Join(End-now)) 
    return false; 

См. С#: Ожидание завершения всех потоков

Ещё вопросы

Сообщество Overcoder
Наверх
Меню