背景
之前在做一個定時下載任務的時候,使用的是一個主線程在執行任務;后面需求調整了,需要在啟用一個子線程執行優先級更高的單獨通道下載。于是下意識的這么做 new Thread
//創建后臺線程Thread bThread = new Thread(new ThreadStart(background1.RunLoop));bThread.Name = "后臺線程";復制代碼
一開始是沒事么問題,后面測試了下發現當程序退出了,線程竟然還在下載,就是說線程沒有隨著程序的結束而結束;
問題就出在前臺線程與后臺線程的區別。
C#中的線程分前臺線程和后臺線程
對于前臺線程來說,如果這些線程不退出,則主線程無法退出,則整個進程也無法退出。會造成即使界面窗口關掉了,但是進程管理器里還有該程序。因此,在關閉窗口時,需要編程顯示的把這些前臺線程關掉才行。但是,這樣就會帶來個問題,需要記錄這些前臺線程的實例才行,很不方便。為此,可以把線程定義為后臺線程。后臺線程與前臺線程的唯一區別就是:后臺線程不需要主動關閉。當所有前臺線程都退出以后,主線程會自動的關掉后臺線程,然后讓進程退出。
后臺線程的定義方法
定義線程為后臺線程的方法為:
Thread backgroundThread = new Thread(new ThreadStart(longTest.RunLoop));backgroundThread.IsBackground = true; //定義為后臺線程復制代碼
后臺線程的問題
當然,定義為后臺線程時,仍然有一種情況,會導致無法退出的情況。即后臺線程引用了主界面的句柄時。很干脆的解決線程無法退出的方法;當然,這里有一個干脆的直接殺掉所有線程的方法:程序主窗口的 Closed 事件中添加代碼:
Process.GetCurrentProcess().Kill();