小编典典

C#:等待所有线程完成

c#

我正在编写的代码中遇到一个通用模式,在该模式下,我需要等待组中的所有线程完成并超时。超时应该是 所有
线程完成所需的时间,所以简单地对每个线程执行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);

但是,对于这种事情似乎应该有一个更简单的习惯用法。


阅读 990

收藏
2020-05-19

共1个答案

小编典典

我仍然认为使用Join更简单。记录预期的完成时间(如Now + timeout),然后循环执行

if(!thread.Join(End-now))
    throw new NotFinishedInTime();
2020-05-19