定期检查是不是所有线程都已完成

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。你也可以Waitawait那个任务。

Thread 是一个遗留 API,很少使用。

【讨论】:

应用程序在 .NET 3.5 中运行,我认为它不支持任务。 @user609926 使用此 nuget 包将 Task 引入 .net 3.5:nuget.org/packages/TaskParallelLibrary【参考方案2】:

@usr 的基于任务的方法是最好的,但是如果您必须依赖线程,那么我建议在每个线程完成时调用一个方法,从您的Threads 集合中删除线程。然后,您在计时器回调中所要做的就是检查集合的计数。依赖ThreadStateis not advisable。

【讨论】:

以上是关于定期检查是不是所有线程都已完成的主要内容,如果未能解决你的问题,请参考以下文章

C# Timer 检查多线程是不是完成失败

Go Evio 应用程序突然没有响应。分析显示所有线程都已停止

检查所有 AsyncTask 是不是已完成

线程;创建一个单独的线程来定期做某事

主线程怎么给子线程发送消息

如何检查是不是所有字段都已填写? [C++,VS 2015,Windows 窗体]