线程由程序员建立,但是建立的方式不一样,整体来讲有两种,一种是我的构造,也就是使用thread类new线程对象建立,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR建立,这一类线程主要存在于线程池中,也叫线程池线程。对于这两种线程的好坏,我的建议最好使用线程池线程,不要大量使用专用线程,对于这一个问题的探讨,读者能够作研究,本文不作讨论。html
前台线程和后台线程程序员
而从回收的角度来看又可分为前台线程和后台线程函数
后台线程:后台线程是能够随时被CLR关闭而不引起异常的,也就是说当后台线程被关闭时,资源的回收是当即的,不等待的,也不考虑后台线程是否执行完成,就算是正在执行中也当即被终止。【后台,存在于黑暗之中默默无闻,它的消亡和存在,别人也感觉不到】spa
前台线程:前台线程是不会被当即关闭的,它的关闭只会发生在本身执行完成时,不受外在因素的影响。假如应用程序退出,形成它的前台线程终止,此时CLR仍然保持活动并运行,使应用程序能继续运行,当它的的前台线程都终止后,整个进程才会被销毁。线程
因此应该使用前台线程执行确实想完成的任务,好比数据的拷贝等等.code
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函数执行完时,前台线程任然在写文件,以下如:orm
(1)在任什么时候候咱们均可以经过线程的IsBackground属性改变线程的先后台属性htm
(2)应用程序的主线程以及使用Thread构造的线程都默认为前台线程对象
线程池线程也就是使用 ThreadPool.QueueUserWorkItem()和Task工厂建立的线程都默认为后台线程blog