黑馬程序員 關於c# windows窗體關閉時線程未能完全退出問題(專題一)


   

<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO開發S</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>

前幾天在用c#  windows窗體編寫坦克大戰游戲時曾用過線程,在程序退出后會發現還有線程在后台運行(打開任務管理器可以看到) 現在用一部分代碼來表達:            public Form1()             {             InitializeComponent();                    IPEndPoint ipendpoint=new IPEndPoint(IPAddress.Parse(txtIP.Text),int.Parse(txtPort.Text));              socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             socket.Bind(ipendpoint);             socket.Listen(10);                               }         }

上邊的代碼無需看懂;

  接下來我再剛才的Form1()中添加如下代碼:

    即:   public Form1()             {                  。。。。。。。

                        //一下為添加代碼

                           Thread threadlisten = new Thread(new ThreadStart(ThreadListen));                            threadlisten.Start();             }

當然程序中代碼不僅僅如此,在此僅為說明問題才列出以上代碼。

 之后運行窗體程序后,關閉窗體。

在任務管理器中發現剛才的程序線程還在后台運行(如果你現在在運行該程序,vs就會報錯提示有線程正在訪問)

為什么會出現這個問題?

  難道是關閉時沒寫線程銷毀。

  所以我又在程序中添加了如下代碼:

         this.Dispose();

    或者

        Application.Exit();

等代碼,結果於事無補。

怎么解決哪?

  那么就要分析線程的優先級以及線程的銷毀周期

我們都知道程序退出的依據是當前程序的所有前台線程都退出(記住是前台線程),在一個正常的windows程序下,我們沒有用線程,所以在退出時,

直接退出UI線程,即窗體就退出了當前程序;然而,我們一旦在程序中附加線程,那么默認情況下該線程也為前台線程,所以,我們在退出Ui(窗體)

時,並沒有退出附加線程。

    所以我們想辦法把我們附加的線程變為后台線程即可。

在我們上面編的程序中加上threadlisten.IsBackground=True;

                               public Form1()            

                                {           

                                     。。。。。。。

                          //一下為添加代碼

                           Thread threadlisten = new Thread(new ThreadStart(ThreadListen));          

                                  threadlisten.IsBackground=True;

                             threadlisten.Start();           

                           }

之后就可以正常退出。

 

<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>


免責聲明!

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



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