У меня есть массив потоков, и я хочу объединить их всех с таймаутом (т.е. посмотреть, все ли они закончились за определенный тайм-аут). Я ищу что-то эквивалентное 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;
}
Но в этом цикле вы можете уменьшить значение тайм-аута:
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;
}
Я предлагаю вам сначала выработать "мертвое время", а затем прокрутить потоки, используя разницу между текущим временем и исходным мертвым временем:
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;
}
if(!thread.Join(End-now))
return false;