<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>