2011-02-15 81 views
30

我有一些非常大的c#和j#應用程序混合。殺死所有應用程序打開的線程

有時當我關閉它時,有一些線程沒有關閉,它們掛在任務管理器中,並且不可能從那裏殺死它們。

我真的很難找到所有這些線程並將它們添加到關閉事件中。

是否有某種方式猛烈殺死關閉事件是由應用程序打開的所有線程?...

感謝。

是否有一些工具可以告訴我什麼線程打開,而我關閉應用程序,誰打開它們?

+0

另請參閱:[關閉多線程應用程序](http:// stackoverflow。com/questions/2314861 /關閉多線程應用程序) – 2011-02-15 10:25:28

回答

42

不應該發生,如果是,你試圖解決它的方式是錯誤的。

當您的應用程序退出時,.NET Framework將自動終止其IsBackground property設置爲「True」的任何線程。將每個工作線程指定爲後臺線程,並且不再有這個問題。利用自動創建後臺線程的BackgroundWorker classThreadPool class是更好的選擇。

否則,您需要明確清理您的前臺線程。一個設計合理的應用程序將自行記帳,並有確定性的結構化方式,確保在退出Main方法之前,其所有線程都已關閉。這是你應該做的無論如何如果你的線程需要一個正常的終止。

殺死這個過程是一個非常糟糕的主意,因爲讓你的線程在你的應用程序中無處不在。

+2

它適用於我 – 2013-09-15 07:15:54

+0

嗯,這是很好的解釋....但是,如果你從一個線程調用WCF Web服務,該服務被卡住了一些未定義的狀態,該怎麼辦?你不能無休止地等待。你必須殺死那個線程。沒有其他方式或我錯了? – Patrik 2015-08-11 09:05:49

+2

你不殺死線程,你用超時調用Web服務。 @patrik – 2016-01-31 15:01:39

4

那麼,你可以打電話Application.Exit()但這不會有太大的幫助。 底線是如果你想正確地做事情,你必須優雅地關閉所有的線程。

+1

沒有工作。我認爲你的意思是`Environment.Exit()`就像在另一個答案中那樣工作。 – 2015-08-24 14:26:52

0

我2美分...所有的答案...

嘗試強制關閉

投入void CurrentApplication_Exit(object sender, ExitEventArgs e)private void Window_Closing(object sender, CancelEventArgs e)這些線路

System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
System.Windows.Application.Current.Shutdown(); 
13

您可以使用:Environment.Exit( 0); ,如果線程正在運行,將會關閉應用程序,並且不會導致任何問題。

0
internal void Close() 
{ 
    Dispatcher.CurrentDispatcher.Thread.Abort(); 
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    Application.Current.Shutdown(); 
} 
1

你應該優雅地關閉線程,但只是希望你和其他人知道,不推薦的方式,但可能:我完全喜歡

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

您的OnClose處理程序科迪灰色的方式做到這一點。