2015-02-08 178 views
1

.NET Framework定義了兩種類型的線程:前景和背景。 默認情況下,當我們創建一個線程時,它是一個前臺線程,但我們可以將其更改爲背景主線程是前臺線程還是後臺線程?

所有進程至少有一個執行線程,通常稱爲主線程,因爲它是一個當你的程序開始時執行。

此主線程是回地線還是前線線程。

回答

0

後臺線程的全部目的是如果只有執行的線程是後臺線程,進程將退出。

主線程需要是前臺線程,否則應用程序會立即退出。

4

真的相當好,你完全否認「前景線」的概念。 CLR沒有它的概念,並沒有以任何方式處理特殊程序的啓動線程。它只是一個「正常」線程,與您使用Thread類創建的任何其他線程沒有什麼不同。 「前景線」是重要的,因爲它正在做最明顯,最「重要」的工作,這有時是正確的,但並非總是如此。例如,不在服務或現代UI應用程序中,它是工作者線程,在其中進行繁重的工作。在控制檯,Winforms或WPF應用程序中這是真的。

這個概念只在傳統運行時環境(如C或C++程序的那些環境)中才真正有效。他們的執行模式可以追溯到20世紀70年代,當時操作系統並不支持線程。在這樣的傳統運行時環境中,具體是程序總是在啓動線程結束時終止,而不管其他線程在運行。這不是CLR的工作方式,它認爲其他線程同樣重要。當然是。

仍然想着「後臺線程」的概念是可以的。一個線程池線程肯定是背景的。他們的IsBackground財產總是true。你可以改變順便說一句,你可以簡單地將它設置爲false並且CLR不會像後臺線程那樣對待它。但是你不能改變它的ApartmentState,它總是MTA,並且使它們從根本上不適合顯示任何用戶界面。換句話說,你永遠不會看到他們:)

後臺線程的最重要的屬性是,你可以把他們當作小兵,你不介意在任務中死亡。隨機地,沒有任何通知和期望沒有可怕的後果。當然,他們做非重要的工作非常重要。例如,如果你讓這樣一個線程寫入一個文件,它已經變得可能了。當士兵被槍殺時,這將會留下一半的文件。這有一個訣竅後來造成麻煩,讀取該文件的另一個程序將會出現故障。後臺線程通常使用網絡或dbase連接。電線另一端的軟件將檢測到連接丟失。它不能說出硬件程序崩潰和正常退出之間的區別。往往最終結束,通常,這樣的軟件是爲了解決這個問題而寫的。長話短說,只有IsBackground屬性很重要。當線程退出時,CLR迭代仍在運行的其餘線程。如果它們中的任何一個具有IsBackground = false,則該過程繼續運行。否則,CLR將卸載主AppDomain。哪一個士兵用粗魯的中止射擊。

+1

很好的解釋和比喻! – Jeb 2015-02-08 12:31:45