如何確保在關閉主窗口後所有程序線程都會中止?如何強制所有程序線程在程序關閉時退出?
回答
- 如果您已經很好地設計了線程,您應該有一種機制來關閉它們 - 例如,使用
ManualResetEvent
信號他們關閉 - 可以的Thread.join等待,直到他們關閉,或Thread.Abort的,讓他們在一個討厭的方式
- 如果他們是後臺線程,他們將在應用程序不會中止關閉
參見:http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
我會添加標準評論 - 永遠不要使用中止(在S/O上進行搜索以查看所有細節,爲什麼這是一個非常糟糕的主意)。 –
請仔細閱讀爲什麼,因爲在大多數情況下,這是一個完全可以接受的折中方案。 「永遠不要放棄」是錯誤的,我害怕。 –
公平點。除非你明白反對的觀點,否則你不要這樣做。 –
收集它們的地方,比如
static public List<Thread> AllThreads;
,並使用該集合.Abort()
他們,一個接一個。
這是硬和錯誤的方式。更好的辦法是讓他們以某種方式停下來,然後一個接着一個地點。
你的意思是'.abort()'? '.Terminate'不存在 –
另外,如果你有一個列表,爲什麼不'AllThreads.ForEach(t => t.Abort());'? –
@KierenJohnstone當我說他們一個接一個終止他時,那正是我的意思。 Lambda,不然,你是一個接一個地終止它們的。 –
您可以設置 「的IsBackground」 屬性設置爲true。當應用程序退出時,CLR會關閉所有後臺線程。
通過讓程序真正關閉,即。不要故意引入任何強制運行主窗口的線程等待其他線程的代碼。運行主窗口的線程然後可以自由地退出Process(),然後操作系統將終止進程中的所有其他線程,無論他們在做什麼。
RGDS, 馬丁
默認情況下在.NET上,不是後臺的線程將意味着應用程序不會簡單地「關閉」。如果你打電話給ExitProcess(在.NET世界中叫做Environment.Exit),那就可以工作了 –
糟糕 - 誤讀了'C#'標籤:((在做C++的時候.. –
設置IsBackground
屬性爲true,並添加以下行:
AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains
讓CloseMe
方法設置這是在線程的主循環檢查的標誌。
嘗試
Application.ExitThread();
Environment.Exit(0);
或
Dispatcher.CurrentDispatcher.Thread.Abort();
- 1. 退出事件處理程序強制應用程序關閉
- 2. 如何在退出應用程序時關閉所有執行程序?
- 3. 退出一個線程關閉所有
- 4. 從線程強行退出程序
- 5. 程序強制關閉
- 6. 確保所有線程都關閉或強行關閉線程?
- 7. 當WPF應用程序關閉時自動退出線程
- 8. 如何強制退出Tkinter程序
- 9. 後退線程不關閉退出應用程序
- 10. 如何強制關閉應用程序
- 11. 如何關閉所有活動並退出應用程序
- 12. 如何在所有線程完成後退出程序?
- 13. NSWindow關閉時退出應用程序
- 14. 退出時應用程序關閉Android
- 15. 退出應用程序時是否應關閉所有資源?
- 16. 無法在退出時關閉所有AWT線程
- 17. 在Android應用程序創建線程結果強制關閉
- 18. 線程OutOfMemoryError,強制關閉
- 19. 退出多線程程序中的所有線程
- 20. 在Windows關閉應用程序退出
- 21. 如何退出多線程程序?
- 22. C#應用程序在關閉時不會退出(有時)
- 23. 強制退出應用程序遇到強制關閉錯誤android
- 24. 如何在窗口關閉時退出MonoMac應用程序?
- 25. 如何強制ruby程序在退出時重新運行?
- 26. Backgroundworker線程不關閉程序關閉?
- 27. 如何在關閉wpf應用程序時關閉所有後臺進程
- 28. bash:退出程序執行,但在退出腳本後關閉程序
- 29. 在退出相關線程之前關閉線程句柄
- 30. 可可 - 強制退出所有其他應用程序
是線程設置爲後臺線程? –
WPF或WinForms? – sll
@ LasseV.Karlsen:否 – armin