定期检查是不是所有线程都已完成
Posted
技术标签:
【中文标题】定期检查是不是所有线程都已完成【英文标题】:Periodically check to see if all threads have completed定期检查是否所有线程都已完成 【发布时间】:2016-08-24 15:19:01 【问题描述】:我有一个多线程应用程序,我希望能够使用计时器定期检查是否所有线程都已完成,然后再启动一个新线程,即:
var checkStatusTimer = new System.Threading.Timer(new TimerCallback(CheckThreads), null, 10000, 10000);
这是我所到之处。 CheckThreads 方法需要做什么来检查它们是否完成?我在想一些类似于检查它们的函数:
foreach (Thread thread in Threads)
Thread t = thread;
if (t.ThreadState != ThreadState.Stopped)
return false;
我在正确的轨道上吗?这是解决这个问题的正确方法吗?或者我应该改用 System.Timers.Timer 吗?另外,我想做这个定期检查的函数形式是静态的。任何帮助,将不胜感激。
【问题讨论】:
我建议您添加标签c# 或其他标签。 【参考方案1】:使用Task
而不是Thread
。然后,您可以创建一个组合任务:
Task[] tasks = ...; //You provide this
Task combined = Task.WhenAll(tasks);
现在您可以检查是否完成:combined.IsCompleted
。你也可以Wait
和await
那个任务。
Thread
是一个遗留 API,很少使用。
【讨论】:
应用程序在 .NET 3.5 中运行,我认为它不支持任务。 @user609926 使用此 nuget 包将 Task 引入 .net 3.5:nuget.org/packages/TaskParallelLibrary【参考方案2】:@usr 的基于任务的方法是最好的,但是如果您必须依赖线程,那么我建议在每个线程完成时调用一个方法,从您的Threads
集合中删除线程。然后,您在计时器回调中所要做的就是检查集合的计数。依赖ThreadStateis not advisable。
【讨论】:
以上是关于定期检查是不是所有线程都已完成的主要内容,如果未能解决你的问题,请参考以下文章