您好,登錄后才能下訂單哦!
小編給大家分享一下c#前臺和后臺線程有什么區別,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
Net的公用語言運行時(Common Language Runtime,CLR)能區分兩種不同類型的線程:前臺線程和后臺線程。這兩者的區別就是:應用程序必須運行完所有的前臺線程才可以退出;而對于后臺線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后臺線程在應用程序退出時都會自動結束。
這么說可能不知道有什么區別:
前臺線程和后臺線程的區別和聯系:
1、后臺線程不會阻止進程的終止。屬于某個進程的所有前臺線程都終止后,該進程就會被終止。所有剩余的后臺線程都會停止且不會完成。
2、可以在任何時候將前臺線程修改為后臺線程,方式是設置Thread.IsBackground 屬性。
3、不管是前臺線程還是后臺線程,如果線程內出現了異常,都會導致進程的終止。
4、托管線程池中的線程都是后臺線程,使用new Thread方式創建的線程默認都是前臺線程。
.net環境使用Thread建立的線程默認情況下是前臺線程,即線程屬性IsBackground=false,在進程中,只要有一個前臺線程未退出,進程就不會終止。主線程就是一個前臺線程。而后臺線程不管線程是否結束,只要所有的前臺線程都退出(包括正常退出和異常退出)后,進程就會自動終止。一般后臺線程用于處理時間較短的任務,如在一個Web服務器中可以利用后臺線程來處理客戶端發過來的請求信息。而前臺線程一般用于處理需要長時間等待的任務,如在Web服務器中的監聽客戶端請求的程序,或是定時對某些系統資源進行掃描的程序。
參考:https://www.jb51.net/article/68008.htm
案例
static void Main(string[] args) { SampleTread thead = new SampleTread(10); SampleTread theadback = new SampleTread(10); var theadone = new Thread(thead.CountNumbers); var theadtwo = new Thread(theadback.CountNumbers); theadtwo.IsBackground = true; theadone.Start(); theadtwo.Start(); }
class SampleTread { private readonly int _iterations; public SampleTread(int iterations) { this._iterations = iterations; } public void CountNumbers() { for (int i = 0; i < _iterations; i++) { Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine($"{ CurrentThread.Name}print{i}"); } } }
分析
運行結果為,當前臺線程執行完畢后那么后臺線程也會退出。其實在操作系統中根本就沒有前后線程這個概念,那么為什么會有這個東西呢?
意義何在?本來是這樣子的當我們的主線程結束的時候其他線程也應該結束,因為釋放了我們的線程對象了,如果主線程結束的時候不釋放其他線程那么其他線程的危害性真的太大了,所以c#為我們提供了前臺線程和后臺線程這個概念讓操作線程變得比較簡單。
至于怎么用,看具體項目了,后臺線程往往起到輔助性的功能。比如說winform,在關閉窗口后線程進程依然沒有關閉,這就是因為關閉close后去執行關閉主線程,其他線程關閉后主線程才會安全關閉。
這就是為什么你還可以看到其他線程的原因,當然你看到還有其他線程的原因可能是多個進程,其他進程的主線程沒有關閉,這個需要具體分析了。
看完了這篇文章,相信你對c#前臺和后臺線程有什么區別有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。