我有一些非常大的c#和j#應用程序混合。殺死所有應用程序打開的線程
有時當我關閉它時,有一些線程沒有關閉,它們掛在任務管理器中,並且不可能從那裏殺死它們。
我真的很難找到所有這些線程並將它們添加到關閉事件中。
是否有某種方式猛烈殺死關閉事件是由應用程序打開的所有線程?...
感謝。
是否有一些工具可以告訴我什麼線程打開,而我關閉應用程序,誰打開它們?
我有一些非常大的c#和j#應用程序混合。殺死所有應用程序打開的線程
有時當我關閉它時,有一些線程沒有關閉,它們掛在任務管理器中,並且不可能從那裏殺死它們。
我真的很難找到所有這些線程並將它們添加到關閉事件中。
是否有某種方式猛烈殺死關閉事件是由應用程序打開的所有線程?...
感謝。
是否有一些工具可以告訴我什麼線程打開,而我關閉應用程序,誰打開它們?
這不應該發生,如果是,你試圖解決它的方式是錯誤的。
當您的應用程序退出時,.NET Framework將自動終止其IsBackground
property設置爲「True」的任何線程。將每個工作線程指定爲後臺線程,並且不再有這個問題。利用自動創建後臺線程的BackgroundWorker
class和ThreadPool
class是更好的選擇。
否則,您需要明確清理您的前臺線程。一個設計合理的應用程序將自行記帳,並有確定性的結構化方式,確保在退出Main
方法之前,其所有線程都已關閉。這是你應該做的無論如何如果你的線程需要一個正常的終止。
殺死這個過程是一個非常糟糕的主意,因爲讓你的線程在你的應用程序中無處不在。
它適用於我 – 2013-09-15 07:15:54
嗯,這是很好的解釋....但是,如果你從一個線程調用WCF Web服務,該服務被卡住了一些未定義的狀態,該怎麼辦?你不能無休止地等待。你必須殺死那個線程。沒有其他方式或我錯了? – Patrik 2015-08-11 09:05:49
你不殺死線程,你用超時調用Web服務。 @patrik – 2016-01-31 15:01:39
那麼,你可以打電話Application.Exit()
但這不會有太大的幫助。 底線是如果你想正確地做事情,你必須優雅地關閉所有的線程。
沒有工作。我認爲你的意思是`Environment.Exit()`就像在另一個答案中那樣工作。 – 2015-08-24 14:26:52
我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();
您可以使用:Environment.Exit( 0); ,如果線程正在運行,將會關閉應用程序,並且不會導致任何問題。
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
你應該優雅地關閉線程,但只是希望你和其他人知道,不推薦的方式,但可能:我完全喜歡
System.Diagnostics.Process.GetCurrentProcess().Kill();
:
您的OnClose處理程序科迪灰色的方式做到這一點。
另請參閱:[關閉多線程應用程序](http:// stackoverflow。com/questions/2314861 /關閉多線程應用程序) – 2011-02-15 10:25:28