有没有方便的方法来定期检查线程状态?

时间:2015-03-13 09:53:11

标签: c# multithreading .net-3.5

我需要清理每个正在运行的线程,以防主线程完成。我在启动后立即在List<Thread>集合中放置了运行线程。 我的&#34;轮&#34;方法是:

static void CheckThreadIsAliveJob(object thread)
{
    while (((Thread)thread).IsAlive)
    {
        Thread.Sleep(1000);
    }
    // DO staff
}

我认为我的方法对于大量的线程而言非常昂贵,因为我需要为每个线程启动带有CheckThreadIsAliveJob主体的新线程。

有什么想法吗?

我重写了上面的代码,但这看起来仍然很合理:

    static void RemoveFinishedThreadsJob(object threadList)
    {
        foreach (var thread in (IList<Thread>)threadList)
        {
            if (!thread.IsAlive)
                lock (threadList)
                {
                    ((IList<Thread>) threadList).Remove(thread);
                }

        }
        Thread.Sleep(1000);
    }

我在班上实现了IDisposable接口的Dispose方法:

        public void Dispose()
        {
            foreach (var thread in _runningThreads)
            {
                if (thread.IsAlive)
                    thread.Abort();
                if (_removeFinishedThreads.IsAlive)
                    _removeFinishedThreads.Abort();
            }
        }

现在,当应用程序关闭且GC正在收集垃圾时,所有正在运行的线程都会手动中止。

2 个答案:

答案 0 :(得分:0)

看起来你只是在循环等待线程退出。如果是这种情况,那么只需使用Thread.Join等待它退出。

此外,永远不要使用Thread.About因为它可能会使您的程序处于不良状态。而是通过调用Join与线程通信它应该关闭并等待线程退出。

答案 1 :(得分:0)

如果您只想在终止主线程时完成其他线程,只需设置Thread.IsBackground=true即可。 它们也会自动终止。