關於Thread.IsBackground屬性的理解

pamxy發表於2013-09-12

轉自:http://blog.csdn.net/luckeryin/article/details/5649144

C#中,Thread類有一個IsBackground 的屬性.MSDN上對它的解釋是:獲取或設定一個值,該值指示某個執行緒是否為後臺執行緒。個人感覺這樣的解釋等於沒有解釋.

.Net中的執行緒,可以分為後臺執行緒和前臺執行緒。後臺執行緒與前臺執行緒並沒有本質的區別,它們之間唯一的區別就是:後臺執行緒不會防止應用程式的程式被終止掉。呵呵,這句話讀出來好像並不那麼好懂.其實,說白了就是當前臺執行緒都結束了的時候,整個程式也就結束了,即使還有後臺執行緒正在執行,此時,所有剩餘的後臺執行緒都會被停止且不會完成.但是,只要還有一個前臺執行緒沒有結束,那麼它將阻止程式結束.這就是為什麼有些設計不夠完美的WinForm程式,在某種特定的情況下,即使所有的視窗都關閉了,但是在工作管理員的管理列表裡仍然可以找到該程式的程式,仍然在消耗著CPU和記憶體資源.因此,在WinForm程式中,關閉所有視窗前,應該停止所有前臺執行緒,千萬不要遺忘了某個前臺執行緒.應用程式程式的存亡由前臺執行緒決定而於後臺執行緒無關.這就是它們的區別.

知道了前後臺執行緒的區別,就應該知道如何宣告IsBackgroud屬性的值了.

值得說明的一點是:改變執行緒從前臺到後臺不會以任何方式改變它在CPU協調程式中的優先順序和狀態。因為前臺後執行緒與程式程式的優先順序無關.

結束前摘錄MSDN上一段示例碼,以幫助大家便好的理解這一區別:

下面的程式碼示例對比了前臺執行緒與後臺執行緒的行為。建立一個前臺執行緒和一個後臺執行緒。前臺執行緒使程式保持執行,直到它完成它的 while 迴圈。前臺執行緒完成後,程式在後臺執行緒完成它的 while 迴圈之前終止。

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        BackgroundTest shortTest = new BackgroundTest(10);
        Thread foregroundThread = 
            new Thread(new ThreadStart(shortTest.RunLoop));
        foregroundThread.Name = "ForegroundThread";

        BackgroundTest longTest = new BackgroundTest(50);
        Thread backgroundThread = 
            new Thread(new ThreadStart(longTest.RunLoop));
        backgroundThread.Name = "BackgroundThread";
        backgroundThread.IsBackground = true;

        foregroundThread.Start();
        backgroundThread.Start();
    }
}

class BackgroundTest
{
    int maxIterations;

    public BackgroundTest(int maxIterations)
    {
        this.maxIterations = maxIterations;
    }

    public void RunLoop()
    {
        String threadName = Thread.CurrentThread.Name;
        
        for(int i = 0; i < maxIterations; i++)
        {
            Console.WriteLine("{0} count: {1}", 
                threadName, i.ToString());
            Thread.Sleep(250);
        }
        Console.WriteLine("{0} finished counting.", threadName);
    }
}

相關文章