Я использую общий шаблон в коде, который я пишу, где мне нужно дождаться завершения всех потоков в группе с тайм-аутом. Тайм-аут должен быть временем, требуемым для завершения всех потоков, поэтому простое выполнение thread.Join(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);
Однако, похоже, для такого рода вещей должна быть более простая идиома.