http://blog.163.com/prince.king_521/blog/static/106891204201172010749138/?latestBlog
1、前台線程和後台線程的基本概念
前台線程和後台線程的主要區別就是:應用程式必須運行完所有的前台線程才可以退出;而對於後台線程,應用程式則可以不考慮其是否已經運行完畢而直接退出,所有的後台線程在應用程式退出時都會自動結束。
注意:通過Thread類建立的線程都是前台線程。線程池ThreadPool(後面將會介紹)中的線程都是後台線程。
非同步委託調用時啟用線程池執行,因此,非同步委託執行的線程是後台線程。
在使用Thread建立前台線程時,可以通過IsBackground屬性以確定該線程是前台線程還是後台線程。參看如下代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace BackAndForThread
{
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(ThreadNew);
t1.Name = "NewThread";
//IsBackground屬性設定為false時 線程 NewThread是可以在主線程執行完畢後列印出兩條訊息的
//IsBackground如果為true,則在主線程結束後,就列印不出第二條訊息了 因為主線程(前台線程)結束了,後台線程也就跟著退出了。
t1.IsBackground = false;
t1.Start();
Console.WriteLine("主線程已經結束");
}
static void ThreadNew() {
Console.WriteLine("新的線程開始輸出訊息");
Thread.Sleep(4000);//停止4秒中讓主線程可以比NewThread提前結束
Console.WriteLine("新的線程結束輸出訊息");
Console.ReadKey();
}
}
}2、前台線程和後台線程適合的場合
通常,應該將被動偵聽活動的線程設定為後台線程,而將負責發送資料的線程設定為前台線程,這樣,在所有的資料發送完畢之前該線程不會被終止。只有在確認線 程被系統隨意終止沒有不利影響時,才應該使用後台線程。如果線程正在執行必須完成的敏感操作或事務操作,或者需要控制關閉線程的方式以便釋放重要資源,則 使用前台線程。
例如 《C#進階編程》中有個例子--如果關閉Word程式,拼字檢查器還在運行其進程就沒有意義了。在關閉應用程式時拼字檢查器線程就可以關閉。
3、非同步委託非同步委託:非同步呼叫不阻塞主線程,而是把調用線上程池中的新線程中執行,我們可以不必關心,也無需關心這個“新線程”是怎麼定義的
委託的非同步呼叫通過BeginInvoke和EndInvoke來實現。