Application.Exit()結束程序,但線程還在的解決方法。


出現此情況大多原因是使用了多線程編程,或者你所調用的dll使用了多線程。
我們知道,一般情況下的線程執行完指定的任務之后是會關閉了的,但是如果對於一些循環類線程,或者忘記關掉的線程時,這個時候就需要我們手動將之強制關閉。
用以下三個中的一個即可嘗試強制關閉線程。

復制內容到剪貼板
代碼:
Application.ExitThread();//退出當前線程上的消息循環,並關閉該線程上的所有窗口。   
復制內容到剪貼板
代碼:
System.Environment.Exit(0);
//終止當前進程並為基礎操作系統提供指定的退出代碼
復制內容到剪貼板
代碼:
Process.GetCurrentProcess().Kill();//終止當前正在運行的線程


但是這些方法都是強制關閉,那么我們如何使用Application.Exit();正常的關閉整個程序呢?
這個時候我們要引用下微軟對Application.Exit();的解釋了:

復制內容到剪貼板
代碼:
Application.Exit();// 方法停止在所有線程上運行的所有消息循環,並關閉應用程序的所有窗口


我們看的非常清楚,停止在所有線程上運行的所有消息循環,既然是所有,那又為何關閉不掉呢?這里我們要搞清楚一點的就是,新開的進程屬於另一個domain(域),你要搞清楚的是進程不等於線程,application.exit();是關閉當前進程的所有線程,不能關閉它創建的進程。新進程和本進程無任何關系。
所以,我們可以這樣理解Application.Exit();

復制內容到剪貼板
代碼:
Application.Exit();// 方法停止在當前進程上的所有線程上運行的所有消息循環,並關閉當前進程上的應用程序的所有窗口。

所以,我們要想在當前進程上使用Application.Exit();關閉其他進程,就要把其他的進程設置為當前進程的后台進程(IsBackground),而當在主線程中創建了一個線程時,那么該線程的IsBackground默認是設置為FALSE的。當主線程退出的時候,IsBackground=FALSE的線程還會繼續執行下去,直到線程執行結束。只有IsBackground=TRUE的線程才會隨着主線程的退出而退出。當初始化一個線程,把Thread.IsBackground=true的時候,指示該線程為后台線程。后台線程將會隨着主線程的退出而退出。


因此我們在創建完進程之后要在后面加上一句:

復制內容到剪貼板
代碼:
IsBackground=true;


然后它才可以被當前進程所控制,然后才可以用Application.Exit();結束。


本文由洗白白丶首發於51cto--.Net論壇,轉載請保留此段文字說明。

http://bbs.51cto.com/thread-970057-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM