C# 线程类 Thread
使用System.Threading.Thread类可以创建和控制线程。
现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程.
建议使用线程的同步手段有: Mutex、ManualResetEvent、AutoResetEvent, Monitor.
.Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.应用程序进程的存亡由前台线程决定而于后台线程无关.这就是它们的区别.改变线程从前台到后台不会以任何方式改变它在CPU协调程序中的优先级和状态。因为前台后线程与程序进程的优先级无关.下面的代码示例对比了前台线程与后台线程的行为。创建一个前台线程和一个后台线程。前台线程使进程保持运行,直到它完成它的 while 循环。前台线程完成后,进程在后台线程完成它的 while 循环之前终止。
C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。
使用线程显示当前时间代码:
using System; using System.Threading; using System.Windows.Forms; namespace 多线程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Thread t;//创建并控制线程,设置其优先级并获取其状态。 private void button1_Click(object sender, EventArgs e) { t = new Thread(Time);//实例化 调用Time方法 t.IsBackground = true;//设置后台线程 t.Start();//线程已准备好,随时可以开始 } void Time()//方法 { while (true)//循环 { textBox1.AppendText(DateTime.Now + "\r\n");//输出 Thread.Sleep(1000);//挂起指定时间,毫秒 } } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false;//获取或设置一个值,该值指示是否捕获对错误线程的调用 } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (t != null)//判断线程是否为null 如果为null 说明当前没执行 { t.Abort();//在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。 } } } }
输出结果: