.NET Framework 2.0中提供了Thread类,用于创建并控制线程,设置线程的优先级并获取线程的状态。在.Net中,线程是由System.Threading命名空间所定义的。
在使用线程的时候首先要引用一个线程System.Threading命名空间,该命名空间的线程类描述了一个线程对象,通过使用类对象,可以创建、删除、停止及恢复一个线程。主要涉及关键的方法见表6-22。
表6-22 线程关键方法
下面介绍Thread类的主要用法。
(1)创建一个新线程要通过new操作,并可以通过start()方法来启动线程。
注意:和Java程序不同,创建新线程并调用start()方法后并不去调用run()方法,而是传递线程调用程序。
(2)下面是启动线程执行的函数:
(3)停止一个线程:Thread.Sleep方法能够在一个固定周期内停止一个线程。
thread.Sleep();
(4)杀死一个线程:线程类的Abort()方法可以永久地杀死一个线程。在杀死一个线程前应该判断线程是否在生存期间。
(5)设定线程优先级:线程类中的ThreadPriority属性用来设定一个ThreadPriority的优先级别。线程优先级别包括Normal、AboveNormal、BelowNormal、Highest和Lowest几种。
thread.Priority=ThreadPriority.Highest;
(6)挂起一个线程:调用线程类的Suspend()方法将挂起一个线程,直到使用Resume()方法唤起它。在挂起一个线程前应该判断线程是否在活动期间。
(www.xing528.com)
(7)唤起一个线程:通过使用Resume()方法可以唤起一个被挂起的线程。在挂起一个线程前应该判断线程是否在挂起期间,如果线程未被挂起则方法不起作用。
在很多情况下,可能要在各个线程中分别执行存在轻微差别的任务,同时需要把某种参数从一种任务所在的线程传递给另一任务所在的线程。要完成这一目标可以采取好几种合理的方式,最直接的做法就是创建一个Task对象,由它保存线程、特有的参数以及提供ThreadStart指派的Worker方法。利用Worker方法即可读取所提供的参数,因为它正好就是Task对象的成员,所以对线程当然是唯一的。通过令线程成为一种公共字段,就可以获得访问线程所有成员的权限,而不必编写额外的封装代码。Thread类型的属性与方法见表6-23、表6-24。
表6-23 Thread类型的属性
表6-24 Thread类型的方法
C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其他的线程同时运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程的功能。
线程被一个线程协调程序管理着——一个CLR委托给操作系统的函数。线程协调程序确保所有活动的线程被分配适当的执行时间;并且那些等待或阻止的线程——比如说在排它锁中或在用户输入——都是不消耗CPU时间的。
在单核处理器的计算机中,线程协调程序完成一个时间片之后迅速地在活动的线程之间进行切换执行。这就导致系统的开销大大增加,在WindowsXP中时间片通常在10毫秒内选择,开销要比CPU在处理线程切换时的消耗大得多。
在多核的计算机中,多线程被实现成混合时间片和真实的并发,不同的线程在不同的CPU上运行。这几乎可以肯定仍然会出现一些时间切片,由于操作系统的需要服务自己的线程,以及一些其他的应用程序。
线程由于外部因素(如时间片)被中断,称为被抢占。在大多数情况下,一个线程方面在被抢占的那一时刻就失去了对它的控制权。
线程与进程的区别和联系在于属于一个单一的应用程序的所有的线程逻辑上被包含在一个进程中,进程指一个应用程序所运行的操作系统单元。
线程与进程有某些相似的地方。比如进程通常以时间片方式与其他在计算机中运行的进程方式与一个C#程序线程运行的方式大致相同。二者的关键区别在于进程彼此是完全隔绝的。线程与运行在相同程序的其他线程共享内存,一个线程可以在后台读取数据,而另一个线程可以在前台展现已读取的数据。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。