Я сталкиваюсь с общим шаблоном в коде, который пишу, где мне нужно дождаться завершения всех потоков в группе с таймаутом. Предполагается, что время ожидания - это время, необходимое для завершения всех потоков, поэтому простое выполнение thread.Join (timeout) для каждого потока не будет работать, так как возможное время ожидания равно timeout * numThreads.
Сейчас я делаю что-то вроде следующего:
var threadFinishEvents = new List<EventWaitHandle>();
foreach (DataObject data in dataList)
{
// Create local variables for the thread delegate
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var localData = (DataObject) data.Clone();
var thread = new Thread(
delegate()
{
DoThreadStuff(localData);
threadFinish.Set();
}
);
thread.Start();
}
Mutex.WaitAll(threadFinishEvents.ToArray(), timeout);
Однако, похоже, для такого рода вещей должна быть более простая идиома.