C#中对线程进行操作时,主要用到了Thread类,该类位于System.Threading命名空间下。通过使用的目Thread类,可以对线程进行创建、暂停、恢复、休眠、终止及设置优先权等操作。另外,还可以通过使用Monitor类、Mutex类和lock关键字控制线程间的同步执行。下面将对Thread类及线程的基本操作进行详细讲解。
01Thread类
Thread类位于System.Threading命名空间下,System.Threading命名空间提供一些可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked和AutoResetEvent等)外,该命名空间还包含一个ThreadPool类(它允许用户使用系统提供的线程池)和一个Timer类(它在线程池的线程上执行回调方法)。
Thread类主要用于创建并控制线程、设置线程优先级并获取其状态。一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码,线程执行的程序代码由ThreadStart委托或ParameterizedThreadStart委托指定。
线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操作系统会接受该优先级。
Thread类的常用属性及说明如表1所示。
表1Thread类的常用属性及说明
Thread类的常用方法及说明如表2所示。
表2Thread类的常用方法及说明
下面演示使用Thread类的相关方法和属性,开始运行一个线程,并获得该线程的相关信息。
程序开发步骤如下:
(1)新建一个Windows应用程序,并命名为1,默认窗体为Forml.cs。
(2)在Form1窗体中添加一个RichTextBox控件,用来显示获得的线程相关信息。
(3)程序主要代码如下:
privatevoidForm1_Load(objectsender,EventArgse){stringstrInfo=string.Empty;//定义一个字符串,用来记录线程相关信息ThreadmyThread=newThread(newThreadStart(threadOut));//实制化Thread线程类对象myThread.Start();//启动主线程//获取线程相关信息strInfo="线程唯一标识符:"+myThread.ManagedThreadld;strInfo+="\n线程名称:"+myThread.Name;strInfo+="\n线程状态:"+myThread.ThreadState.ToString();strInfo+="\n线程优先级:"+myThread.Priority.ToString();strInfo+="\n是否为后台线程:"+myThread.IsBackground;Thread.Sleep();//使主线程休眠1秒钟myThread.Abort("退出");//通过主线程阻止新开线程myThread.Join();//等待新开的线程结束MessageBox.Show("线程运行结束");richTextBox1.Text=strInfo;}publicvoidthreadOut(){MessageBox.Show("主线程开始运行")}
注意在程序中使用线程时,需要在命名空间区域添加using、System、Threading命名空间,下面遇到时将不再提示。
运行程序,先后弹出如图1和图2所示的对话框,然后显示如图3所示的主窗体,并在主窗体中显示获得的线程相关信息。
图1线程开始运行
图2线程运行结束
图3主窗体
02创建线程
创建一个线程非常简单,只需将其声明并为其提供线程起始点处的方法委托即可,创建新的线程时,需要使用Thread类,该类具有接受一个ThreadStart委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法。创建了Thread类的对象之后,线程对象已存在并已配置,但并未创建实际的线程,这时,只有在调用Start方法后,才会创建实际的线程。
Start方法用来使线程被安排执行,它有两种重载形式,下面分别进行介绍。
(1)导致操作系统将当前实例的状态更改为ThreadState.Running。
语法如下:
publicvoidStart()
(2)导致操作系统将当前实例的状态更改为ThreadStateRunning,并选择提供包含线程执行的方法要使用的数据的对象。
语法如下:
publicvoidStart(Objectparameter)
parameter:一个对象,包含线程执行的方法要使用的数据。
注意如果线程已经终止,就无法通过再次调用Start方法来重新启动。
创建一个控制台应用程序,其中自定义一个静态的void类型方法createThread。然后在Main方法中通过实例化Thread类对象创建一个新的线程,最后调用Start方法启动该线程。
代码如下:
staticvoidMain(string[]args){ThreadmyThread;//声明线程//用线程起始点的ThreadStart委托创建该线程的实例myThread=newThread(newThreadStart(createThread);myThread.Start();//启动线程}publicstaticvoidcreateThread(){Console.Write("创建线程");}
注意线程的入口(为createThread)不带任何参数