2015-03-13 85 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

相關問題