1.主線程
當一個程序啓動時,就有一個進程被操做系統(OS)建立,與此同時一個線程也馬上運行,該線程一般叫作程序的主線程(Main Thread),由於它是程序開始時就執行的,若是你須要再建立線程,那麼建立的線程就是這個主線程的子線程。每一個進程至少都有一個主線程,在Winform中,應該就是建立GUI的線程。主線程的重要性體如今兩方面:1.是產生其餘子線程的線程;2.一般它必須最後完成執行好比執行各類關閉動做。html
2.前臺線程,後臺線程,託管線程,守護線程this
CLR能區分兩種不一樣類型的線程:前臺線程和後臺線程。這二者的區別就是:應用程序必須運行完全部的前臺線程才能夠退出;而對於後臺線程,應用程序則能夠不考慮其是否已經運行完畢而直接退出,全部的後臺線程在應用程序退出時都會自動結束。 一個線程是前臺線程仍是後臺線程可由它的IsBackground屬性來決定。這個屬性是可讀又可寫的。它的默認值爲false,即意味着一個線程默認爲前臺線程。咱們能夠將它的IsBackground屬性設置爲true,從而使之成爲一個後臺線程。
後臺線程又叫守護線程,它被CLR認爲是程序執行中可作出犧牲的途徑,即在任什麼時候候均可能被忽略,所以,若是全部的前臺線程終止,當應用程序域卸載時,全部的後臺線程也會被自動終止。值得注意的是:前臺線程和後臺線程並不等同於主線程和工做線程,默認狀況下,經過Thread.Start()方法建立的線程都自動成爲前臺線程。把線程的IsBackground屬性設爲 true就能夠將線程配置爲後臺線程。url
託管線程或者是後臺線程,或者是前臺線程。 後臺線程不會使託管執行環境處於運行狀態,除此以外,後臺線程與前臺線程是同樣的。 一旦全部前臺線程在託管進程(其中 .exe 文件是託管程序集)中被中止,系統將中止全部後臺線程並關閉。操作系統
3.子線程.net
默認狀況,在新開啓一個子線程的時候,他是前臺線程,只有,將線程的IsBackground屬性設爲true;他纔是後臺線程
當子線程是前臺線程,則主線程結束並不影響其餘線程的執行,只有全部前臺線程都結束,程序結束
當子線程是後臺線程,則主線程的結束,會致使子線程的強迫結束
(我的理解,這樣設計的緣由:由於後臺線程通常作的都是須要花費大量時間的工做,若是不這樣設計,主線程已經結束,然後臺工做線程還在繼續,第一有可能使程序陷入死循環,第二主線程已經結束,後臺線程即時執行完成也已經沒有什麼實際的意義)線程
4.名詞之間的關係總結設計
託管線程包括前臺線程和後臺線程orm
守護線程是後臺線程htm
主線程是一個前臺線程,前臺線程能夠是多個的blog
子線程是從屬與主線程的,子線程能夠是多個
5.DEMO:
public partial class Form1 : Form
{
public Form1()
{
j=1;
InitializeComponent();
}
static int j;
private void btnMultiThread_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(MultiMethod));//子線程默認是前臺線程
th.IsBackground = true;//將一個線程設置爲後臺線程,就能夠保證前臺線程關閉後,後臺線程也會中止執行。
th.Start();
//this.lbCounter.Text = j.ToString();
}
private void MultiMethod()
{
for (int i = 0; i < 99999999; i++)
{
}
j=10000;//j是上下文中的變量,屬於進程(static),因此是能夠訪問的。
//this.lbCounter.Text =j.ToString();//控件是屬於UI線程(主線程,前臺線程),直接跨線程是訪問不了的。
MessageBox.Show("循環9999999次結束!");//MessageBox類是進程上下文環境中的資源,不屬於Form1主線程(前臺線程,UI線程)
this.Invoke(new Action(() => { lbCounter.Text = j.ToString(); }));//跨線程須要使用主線程的Invoke方法
}
private void btnSingle_Click(object sender, EventArgs e)
{
MultiMethod();//UI線程是同步,會等待很多時間。
}
private void btnCloseUI_Click(object sender, EventArgs e)
{
this.Close();//前臺線程(UI線程,主線程)關閉,後臺線程會中止執行
}
}
6.參考資料
http://msdn.microsoft.com/zh-cn/library/h339syd0
http://npfeng900.blog.163.com/blog/static/14456108201092431813416/
http://blog.sina.com.cn/s/blog_4b3485000100pigr.html
http://blog.csdn.net/jasonvip_c/article/details/5718636
http://baike.baidu.com/link?url=iHKpEFeXOm3-za_4Uq0RRUlhanBFw063O0UAMCRb6VcF_3xaU-x9kQ-tQcUdDBnn