線程的IsBackground屬性

.Net的公用語言運行時(Common Language Runtime,CLR)能區分兩種不同類型的線程:前臺線程和後臺線程。這兩者的區別就是:應用程序必須運行完所有的前臺線程纔可以退出;而對於後臺線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的後臺線程在應用程序退出時都會自動結束

.net環境使用Thread建立的線程默認情況下是前臺線程,即線程屬性IsBackground=false,在進程中,只要有一個前臺線程未退出,進程就不會終止。主線程就是一個前臺線程。而後臺線程不管線程是否結束,只要所有的前臺線程都退出(包括正常退出和異常退出)後,進程就會自動終止。一般後臺線程用於處理時間較短的任務,如在一個Web服務器中可以利用後臺線程來處理客戶端發過來的請求信息。而前臺線程一般用於處理需要長時間等待的任務,如在Web服務器中的監聽客戶端請求的程序,或是定時對某些系統資源進行掃描的程序。下面的代碼演示了前臺和後臺線程的區別。

public static void myStaticThreadMethod()
{
    Thread.Sleep(3000);
}
Thread thread = new Thread(myStaticThreadMethod);
// thread.IsBackground = true;
thread.Start()
如果運行上面的代碼,程序會等待3秒後退出,如果將註釋去掉,將thread設成後臺線程,則程序會立即退出
要注意的是,必須在調用Start方法之前設置線程的類型,否則一但線程運行,將無法改變其類型
通過BeginXXX方法運行的線程都是後臺線程

啓動了多個線程的程序在關閉的時候卻出現了問題,如果程序退出的時候不關閉線程,那麼線程就會一直的存在,但是大多啓動的線程都是局部變量,不能一一的關閉,如果調用Thread.CurrentThread.Abort()方法關閉主線程的話,就會出現ThreadAbortException 異常,因此這樣不行。
後來找到了這個辦法: Thread.IsBackground設置線程爲後臺線程。

msdn對前臺線程和後臺線程的解釋:託管線程或者是後臺線程,或者是前臺線程。後臺線程不會使託管執行環境處於活動狀態,除此之外,後臺線程與前臺線程是一樣的。一旦所有前臺線程在託管進程(其中 .exe文件是託管程序集)中被停止,系統將停止所有後臺線程並關閉。通過設置 Thread.IsBackground 屬性,可以將一個線程指定爲後臺線程或前臺線程。例如,通過將 Thread.IsBackground 設置爲 true,就可以將線程指定爲後臺線程。同樣,通過將 IsBackground 設置爲 false,就可以將線程指定爲前臺線程。從非託管代碼進入托管執行環境的所有線程都被標記爲後臺線程。通過創建並啓動新的 Thread 對象而生成的所有線程都是前臺線程。如果要創建希望用來偵聽某些活動(如套接字連接)的前臺線程,則應將 Thread.IsBackground 設置爲 true,以便進程可以終止。
所以解決辦法就是在主線程初始化的時候,設置:Thread.CurrentThread.IsBackground = true;

這樣,主線程就是後臺線程,在關閉主程序的時候就會關閉主線程,從而關閉所有線程。但是這樣的話,就會強制關閉所有正在執行的線程,所以在關閉的時候要對線程工作的結果保存。


基於前後臺線程的區別,在實際編碼中應該更多地使用後臺線程。只有在非常關鍵的工作中,如線程正在執行事務或佔有的某些非託管資源需要釋放時,才使用前臺線程。


http://book.51cto.com/art/201109/292349.htm

http://www.51testing.com/html/55/102055-211889.html

http://blog.163.com/liulei0729@126/blog/static/32530612201071743942648/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章