我有一個應用程序在單獨的Thread
中執行一些後臺任務(網絡偵聽&讀取)。但是,當我關閉應用程序時(單擊標題欄上的「x」按鈕),線程似乎沒有被終止/中止。 是因爲主線程程序是while(true) {...}
? 這裏有什麼解決方案?我正在尋找線程的「中斷」標誌作爲「while」循環的條件,但沒有找到任何標誌。線程不會在應用程序關閉時中止
回答
最簡單的方法是將線程的IsBackground屬性設置爲true。這將阻止它保持應用程序的開放。當所有非後臺線程終止時,應用程序終止。
停止線程的更可控制的方法是發送一條消息,使其乾淨地關閉並確保它在終止主線程之前終止。
我不推薦的方法是致電Thread.Abort
。這有一些問題,其中之一是它不能保證終止線程。從文檔:
調用此方法通常終止線程。
強調我的。
好,而不是while(true)
,也許你應該:
while(appIsRunning)
{
}
而且,在你的形式結束活動,
appIsRunning = false;
thread.Join(2000);
在最後一行是隻是爲了確保您等待線程乾淨地完成。還有很多其他的方法可以強制結束一個線程,但問題就在那裏:你不希望成爲,你希望它們儘可能自然地發生。
加入後,您可以檢查線程的狀態以查看它是否已完成。如果不是,然後(並且只有這樣)纔會強制終止並且可能會通知您的用戶(或寫入日誌記錄)某些事情沒有按照應有的方式結束。
是的,但請記住使用'volatile'或'lock'或其他一些同步方法。 – 2010-05-17 21:57:05
@Mark:這裏可能是完全錯誤的,但是由於子線程只讀取並且主線程只寫入,是否有機會出現錯誤? – 2010-05-17 22:42:16
如果不同步,則不保證在另一個線程中可以看到一個線程的appIsRunning更改。你可以在這裏閱讀更多:http://timl.net/2009/03/volatile-memory.html – 2010-05-17 22:46:54
你可以提高從標識符名稱,而(真)環路
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
更優雅一點,短。
您可以隨時生效的問題:
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
更好的方法是馬克已經提到的Thread.IsBackground屬性設置爲true。
您就可以開始您的主題:
ThreadPool.QueueUserWorkItem(DoStuff, input)
而且它會隨着應用程序關閉自動中止。
- 1. 如何在應用程序窗口關閉時中止線程
- 2. 在關閉android應用程序時停止線程?
- 3. 在關閉應用程序時:如何停止線程?
- 4. Install4j - 應用程序在關閉時不會停止MacOS X
- 5. Backgroundworker線程不關閉程序關閉?
- 6. C#應用程序不會關閉
- 7. 應用程序不會關閉
- 8. VC11 Winsock應用程序不會關閉
- 9. 程序在關閉應用程序後不停止
- 10. wxpython關閉線程的應用程序
- 11. 關閉多線程應用程序
- 12. 某些線程不與GMAP停止時,我關閉應用程序
- 13. C#.Net中的應用程序關閉時可以中止前臺線程嗎?
- 14. C#應用程序在關閉時不會退出(有時)
- 15. 如何在Android應用程序中停止應用程序時關閉gps
- 16. 如何在應用程序停用時關閉線程?
- 17. 當我關閉應用程序時,AsyncTask會停止嗎?
- 18. 每次關閉或離開時終止應用程序會話
- 19. 查找並終止線程以關閉應用程序
- 20. 線程未正確完成,阻止應用程序關閉
- 21. 防止應用程序從關閉的所有線程完成
- 22. onLocationChanged在應用程序關閉時不會被調用
- 23. Java如何在程序關閉時停止線程
- 24. 新GDR3「關閉按鈕」不會終止應用程序?
- 25. 應用程序在運行線程關閉時崩潰
- 26. 當應用程序暫時關閉時,不會調用UIApplicationWillEnterForegroundNotification
- 27. 如何在C#windows應用程序中單擊關閉按鈕時阻止應用程序關閉?
- 28. 防止在Python中打開文件時關閉應用程序
- 29. 當應用程序關閉時,我可以檢測到應用程序何時終止了後臺線程?
- 30. Android應用程序在關閉主要活動時不會關閉
+1消息方法。'while(stayAlive)'而不是'true'會更乾淨,即使循環可能需要幾秒鐘時間才能清除。 – user7116 2010-05-17 21:58:43