c# winform 關閉窗體時,同時結束線程(轉)


加一退出標志位,在關閉form的時候讓線程安全退出

volatile bool flag=true;

TreadFunction()
{
while(flag)
{
//do Run Tread
}
}
//在form的關閉事件中設置退出標志;
Form_Closing(Object o,EverntArgs e)
{
flag=false;

 

 

 

在程序中,創建了線程進行繪圖:

using System.Threading;//命名空間
  • 1
Thread show3DThread; //聲明工作線程
  • 1
//點擊按鈕事件
private void button3DShow_Click(object sender, EventArgs e)
        {            
            show3DThread=new Thread(ShowData);//創建線程            
            show3DThread.Start();//啟動線程            
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在繪圖過程中,點擊Form的關閉按鈕以退出程序時,會報錯:
在這里插入圖片描述

解決方式:在線程那里設置個屬性:

private void button3DShow_Click(object sender, EventArgs e)
        {            
            show3DThread=new Thread(ShowCSVData);
            show3DThread.IsBackground = true;
            show3DThread.Start();            
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

這個屬性的意思就是把線程設置為后台線程,然后關閉進程的同時,線程也會隨之關閉。

程序退出的方法:
this.Close(); 只是關閉當前窗口,若不是主窗體的話,是無法退出程序的,另外若有托管線程(非主線程),也無法干凈地退出;
Application.Exit(); 強制所有消息中止,退出所有的窗體,但是若有托管線程(非主線程),也無法干凈地退出;
Application.ExitThread(); 強制中止調用線程上的所有消息,同樣面臨其它線程無法正確退出的問題;
System.Environment.Exit(0); 這是最徹底的退出方式,不管什么線程都被強制退出,把程序結束的很干凈。
我是用了 th.IsBackground = true 就解決了的,System.Environment.Exit(0);是不是更徹底些呢?

附上IsBackground對線程的重要作用:
1、當在主線程中創建了一個線程,那么該線程的IsBackground默認是設置為FALSE的。
2、當主線程退出的時候,IsBackground=FALSE的線程還會繼續執行下去,直到線程執行結束。
3、只有IsBackground=TRUE的線程才會隨着主線程的退出而退出。
4、當初始化一個線程,把Thread.IsBackground=true的時候,指示該線程為后台線程。后台線程將會隨着主線程的退出而退出。
5、原理:只要所有前台線程都終止后,CLR就會對每一個活在的后台線程調用Abort()來徹底終止應用程序。

參考:c# winform 關閉窗體時,同時結束線程


免責聲明!

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



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