我有一个线程数组,我想在超时的情况下将它们全部加入(即查看它们是否都在某个超时内完成)。我正在寻找与 WaitForMultipleObjects 等效的东西或将线程句柄传递到 WaitHandle.WaitAll 的方法,但我似乎无法在 BCL 中找到任何我想要的东西。

我当然可以遍历所有线程(见下文),但这意味着整个函数可能需要 timeout * 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;
}

关于c# - Thread.Join 在多个线程上超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1661930/

10-10 22:51