線程由程序員建立,但是建立的方式不一樣,整體來講有兩種,一種是我的構造,也就是使用thread類new線程對象建立,這一類線程是大部分程序員知道的,也叫專用線程;還有一種是由CLR建立,這一類線程主要存在於線程池中,也叫線程池線程。對於這兩種線程的好壞,我的建議最好使用線程池線程,不要大量使用專用線程,對於這一個問題的探討,讀者能夠作研究,本文不作討論。程序員
前臺線程和後臺線程函數
而從回收的角度來看又可分爲前臺線程和後臺線程spa
後臺線程:後臺線程是能夠隨時被CLR關閉而不引起異常的,也就是說當後臺線程被關閉時,資源的回收是當即的,不等待的,也不考慮後臺線程是否執行完成,就算是正在執行中也當即被終止。【後臺,存在於黑暗之中默默無聞,它的消亡和存在,別人也感覺不到】線程
前臺線程:前臺線程是不會被當即關閉的,它的關閉只會發生在本身執行完成時,不受外在因素的影響。假如應用程序退出,形成它的前臺線程終止,此時CLR仍然保持活動並運行,使應用程序能繼續運行,當它的的前臺線程都終止後,整個進程纔會被銷燬。code
因此應該使用前臺線程執行確實想完成的任務,好比數據的拷貝等等.orm
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO; class class1 { static void Main(string[] args) { Thread tmpThread = new Thread(WriteFile);//默認爲前臺線程 tmpThread.Name = "TestThread"; //tmpThread.IsBackground = true; tmpThread.Start(); //Console.ReadKey(); } /// <summary> /// 寫文件 /// </summary> static void WriteFile() { while (true) { using (FileStream fs = File.Open(@"D:\test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) { byte[] buff = System.Text.UnicodeEncoding.UTF8.GetBytes(string.Format("Time:{0}\r\n", DateTime.Now.ToString())); fs.Write(buff, 0, buff.Length); } Thread.Sleep(10); } } }
在上面的程序中咱們使用了一個線程默認爲前臺線程,當控制檯程序的Main函數執行完時,前臺線程任然在寫文件,以下如:對象
(1)在任什麼時候候咱們均可以經過線程的IsBackground屬性改變線程的先後臺屬性blog
(2)應用程序的主線程以及使用Thread構造的線程都默認爲前臺線程進程
線程池線程也就是使用 ThreadPool.QueueUserWorkItem()和Task工廠建立的線程都默認爲後臺線程資源