我有一个线程数组,我想在超时的情况下将它们全部加入(即查看它们是否都在某个超时内完成)。我正在寻找与 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/