我正在编写的代码中遇到一个通用模式,在该模式下,我需要等待组中的所有线程完成并超时。超时应该是 所有 线程完成所需的时间,所以简单地对每个线程执行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);
但是,对于这种事情似乎应该有一个更简单的习惯用法。
我仍然认为使用Join更简单。记录预期的完成时间(如Now + timeout),然后循环执行
if(!thread.Join(End-now)) throw new NotFinishedInTime();