C#中前臺線程和后臺線程的區(qū)別與聯(lián)系
前臺線程和后臺線程的區(qū)別和聯(lián)系:
1、后臺線程不會阻止進(jìn)程的終止。屬于某個進(jìn)程的所有前臺線程都終止后,該進(jìn)程就會被終止。所有剩余的后臺線程都會停止且不會完成。
2、可以在任何時候?qū)⑶芭_線程修改為后臺線程,方式是設(shè)置Thread.IsBackground 屬性。
3、不管是前臺線程還是后臺線程,如果線程內(nèi)出現(xiàn)了異常,都會導(dǎo)致進(jìn)程的終止。
4、托管線程池中的線程都是后臺線程,使用new Thread方式創(chuàng)建的線程默認(rèn)都是前臺線程。
下面做個小例子來證實一下,代碼如下很簡單:
class Program { static AutoResetEvent autoEvent =new AutoResetEvent(false); staticvoid Main() { Thread newThread =new Thread(new ThreadStart(ThreadMethod)); //newThread.IsBackground = true; Console.WriteLine("主線程開始執(zhí)行。"); newThread.Start(); Console.WriteLine("主線程結(jié)束"); } staticvoid ThreadMethod() { //掛起子線程 autoEvent.WaitOne(); Console.WriteLine("子線程執(zhí)行"); } }
我在第9行下了個斷點,來看一下通過 new Thread方式創(chuàng)建的線程的IsBackground屬性,截圖如下:
可見通過new Thread方式創(chuàng)建的線程,確實是默認(rèn)為前臺線程。
程序運行的結(jié)果如下圖:
該控制太程序沒有像平時一樣自動關(guān)閉,而使一直停在那里。并且我們從圖中可以看到主線程執(zhí)行完了,而子線程(前臺線程)并沒有執(zhí)行完(因為被autoEvent.WaitOne()方法掛起了)。
這就說明了前臺線程是可以阻止進(jìn)程的終止的。
如果將第8行的注釋去掉的話,控制臺程序?qū)⒆詣咏K止,大家可以試一下。
相關(guān)文章
C# DataTable與Model互轉(zhuǎn)的示例代碼
這篇文章主要介紹了C#DataTable與Model互轉(zhuǎn)的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12C#遞歸應(yīng)用之實現(xiàn)JS文件的自動引用
這篇文章主要為大家詳細(xì)介紹了C#如何利用遞歸實現(xiàn)JS文件的自動引用的功能,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的可以參考一下2023-03-03