2015-03-13 46 views
-1

如果主线程完成,我需要清理每个正在运行的线程。在启动之后,我立即将正在运行的线程放入List<Thread>集合中。 我的“车轮”的方法是:是否有任何方便的方法来定期检查线程状态?

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

我觉得我的做法是对的线程大量非常昂贵的,因为我需要与CheckThreadIsAliveJob身体开始新的线程为每个人。

任何想法?

我rewrited上面的代码,但是这看起来还是AGLY:

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正在收集垃圾,所有正在运行的线程都将手动中止。

+0

您正在重新实现Thread.IsBackground属性。只需将其设置为* true *。 – 2015-03-13 11:18:06

回答

0

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

此外,从来没有使用Thread.About,因为它可以让你的程序是一个糟糕的状态。而应该通知线程它应该关闭,并等待线程退出,然后调用Join

+0

“阻塞调用线程,直到线程终止。”那么,如何成为大量的线程呢? – 2015-03-13 10:35:21

+0

这没关系。你正忙着在你的'RemoveFinishedThreadJobs'中旋转,等待所有事情完成。这浪费了CPU,并且你正在有效地阻止。只是等待线程退出而不是轮询它。 – Sean 2015-03-13 10:56:21

+0

你能提供一些例子吗?我没有得到,如何阻止加入可能会帮助我收集正在运行的线程来清除它们。线程可能永远不会返回,所以我需要清理它以防我的应用程序关闭。另外,我并不忙,因为旋转是在单独的线程中,当应用程序关闭时也会清理干净。 – 2015-03-13 11:12:48

0

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

+0

谢谢,这是解决方案的一部分。释放线程捕获的资源是非常重要的。 – 2015-03-13 15:30:22

+0

不用担心。 是的,这是一个问题。有关可能的解决方案,请查看此链接: [链接](https://msdn.microsoft.com/en-us/library/orm-9780596527570-03-19.aspx) 特别关注以下部分: _“当后台线程以这种方式终止时,任何finally块都会被绕过,如果你的程序最后使用block(或using关键字)来执行清理工作,比如释放资源或删除临时文件,那么这是一个问题。您可以在退出应用程序时明确地等待这些后台线程。“_ – quetzy 2015-03-13 20:31:25

相关问题