前台線程和后台線程


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


一個線程是前台線程還是后台線程可由它的IsBackground屬性來決定。這個屬性是可讀又可寫的。它的默認值為false,即意味着一個線程默認為前台線程。我們可以將它的IsBackground屬性設置為true,從而使之成為一個后台線程。 


下面的例子是一個控制台程序,程序一開始便啟動了10個線程,每個線程運行5秒鍾時間。由於線程的IsBackground屬性默認為false,即它們都是前台線程,所以盡管程序的主線程很快就運行結束了,但程序要到所有已啟動的線程都運行完畢才會結束。示例代碼如下:

using System; 
using System.Threading; 

class MyApp 

    public static void Main() 
    { 
        for (int i = 0; i < 10; i++) 
        { 
            Thread thread = new Thread(new ThreadStart(ThreadFunc)); 
            thread.Start(); 
        } 
    } 
  
    private static void ThreadFunc() 
    { 
        DateTime start = DateTime.Now; 
        while ((DateTime.Now - start).Seconds < 5) 
            ; 
    } 
}


接下來我們對上面的代碼進行略微修改,將每個線程的IsBackground屬性都設置為true,則每個線程都是后台線程了。那么只要程序的主線程結束了,整個程序也就結束了。示例代碼如下:

 

using System; 
using System.Threading;  

class MyApp 

    public static void Main() 
    { 
        for (int i = 0; i < 10; i++) 
        { 
            Thread thread = new Thread(new ThreadStart(ThreadFunc)); 
            thread.IsBackground = true; 
            thread.Start(); 
        } 
    }

  
    private static void ThreadFunc() 
    { 
        DateTime start = DateTime.Now; 
        while ((DateTime.Now - start).Seconds < 5) 
            ; 
    } 
}

既然前台線程和后台線程有這種差別,那么我們怎么知道該如何設置一個線程的IsBackground屬性呢?下面是一些基本的原則:對於一些在后台運行的線程,當程序結束時這些線程沒有必要繼續運行了,那么這些線程就應該設置為后台線程。比如一個程序啟動了一個進行大量運算的線程,可是只要程序一旦結束,那個線程就失去了繼續存在的意義,那么那個線程就該是作為后台線程的。而對於一些服務於用戶界面的線程往往是要設置為前台線程的,因為即使程序的主線程結束了,其他的用戶界面的線程很可能要繼續存在來顯示相關的信息,所以不能立即終止它們。這里我只是給出了一些原則,具體到實際的運用往往需要編程者的進一步仔細斟酌。 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com