线程是使用Thread类来处理的,该类在System.Threading命名空间中。通过实例化一个Thread对象就可以创建一个线程。创建新的 Thread 对象时,将创建新的托管线程。Thread 类具有接受一个 ThreadStart 委托或 ParameterizedThreadStart 委托的构造函数,该委托包装了调用 Start 方法时由新线程调用的方法。代码如下:
Thread t = new Thread(new ThreadStart(TestMethord));
t.Start();
上述代码实例化了一个Thread 对象,并指明了将要调用的方法TestMethord,然后启动线程。ThreadStart委托中作为参数的方法不需要参数,并且没有返回值。ParameterizedThreadStart委托一个对象为参数,利用这个参数可以很方便的向线程传递参数。代码如下:
Thread th = new Thread(new ParameterizedThreadStart (TestMethord));
th.Start(99);
‘
线程是通过线程类Thread来处理的,下面介绍Thread类的属性和方法。如表38.1所示。
1.Thread类的属性
Thread类的属性如表表所示。
表 Thread类常用属性及说明
属性 |
说明 |
ApartmentState |
获取或设置此线程的单元状态 |
CurrentContext |
获取线程正在其中执行的当前上下文 |
CurrentCulture |
获取或设置当前线程的区域性 |
CurrentPrincipal |
获取或设置线程的当前负责人(对基于角色的安全性而言) |
CurrentThread |
获取当前正在运行的线程 |
CurrentUICulture |
获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源 |
ExecutionContext |
获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息 |
IsAlive |
获取一个值,该值指示当前线程的执行状态 |
IsBackground |
获取或设置一个值,该值指示某个线程是否为后台线程 |
IsThreadPoolThread |
获取一个值,该值指示线程是否属于托管线程池 |
ManagedThreadId |
获取当前托管线程的惟一标识符 |
获取或设置线程的名称 | |
Priority |
获取或设置一个值,该值指示线程的调度优先级 |
ThreadState |
获取一个值,该值包含当前线程的状态 |
下面对Thread类中比较重要的属性进行详细介绍。
(1)IsAlive属性:判断线程的状态:
获取一个值,该值指示当前线程的执行状态。
语法:
public bool IsAlive { get; }
属性值:如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。
(2)Name属性
获取或设置线程的名称。
语法:
public string Name { get; set; }
属性值:包含线程名称的字符串,或者如果未设置名称,则为空引用。
(3)ThreadState 属性
获取一个值,该值包含当前线程的状态。
语法:
public ThreadState ThreadState { get; }
属性值:ThreadState 值之一,它指示当前线程的状态。初始值为 Unstarted。
2.Thread类的方法
Thread类的方法如下表所示。
表 Thread类常用方法及说明
方法 |
说明 |
Abort |
在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程 |
AllocateDataSlot |
在所有的线程上分配未命名的数据槽 |
AllocateNamedDataSlot |
在所有线程上分配已命名的数据槽 |
通知宿主执行将要进入一个代码区域,在该代码区域内线程中止或未处理的异常的影响可能会危害应用程序域中的其他任务 | |
BeginThreadAffinity |
通知宿主托管代码将要执行依赖于当前物理操作系统线程的标识的指令 |
EndCriticalRegion |
通知宿主执行将要进入一个代码区域,在该代码区域内线程中止或未处理的异常仅影响当前任务 |
EndThreadAffinity |
通知宿主托管代码已执行完依赖于当前物理操作系统线程的标识的指令 |
Equals |
确定两个 Object 实例是否相等 |
FreeNamedDataSlot |
为进程中的所有线程消除名称与槽之间的关联 |
GetApartmentState |
返回一个 ApartmentState 值,该值指示单元状态 |
GetCompressedStack |
返回一个 CompressedStack 对象,该对象可用于捕获当前线程的堆栈 |
GetData |
在当前线程的当前域中从当前线程上指定的槽中检索值 |
GetDomain |
返回当前线程正在其中运行的当前域 |
返回惟一的应用程序域标识符 | |
GetHashCode |
返回当前线程的哈希代码 |
GetNamedDataSlot |
查找已命名的数据槽 |
GetType |
获取当前实例的 Type |
Interrupt |
中断处于 WaitSleepJoin 线程状态的线程 |
Join |
阻止调用线程,直到某个线程终止时为止 |
MemoryBarrier |
同步内存。其效果是将缓存内存中的内容刷新到主内存中,从而使处理器能执行当前线程 |
ReferenceEquals |
确定指定的 Object 实例是否是相同的实例 |
ResetAbort |
取消为当前线程请求的 Abort |
Resume |
继续已挂起的线程 |
SetApartmentState |
在线程启动前设置其单元状态 |
SetCompressedStack |
对当前线程应用捕获的 CompressedStack |
SetData |
在当前正在运行的线程上为此线程的当前域在指定槽中设置数据 |
Sleep |
将当前线程阻止指定的毫秒数 |
SpinWait |
导致线程等待由 iterations 参数定义的时间量 |
Start |
使线程被安排进行执行 |
Suspend |
挂起线程,或者如果线程已挂起,则不起作用 |
ToString |
返回表示当前 Object 的 String |
TrySetApartmentState |
在线程启动前设置其单元状态 |
VolatileRead |
读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值 |
VolatileWrite |
立即向字段写入一个值,以使该值对计算机中的所有处理器都可见 |
下面对Thread类中比较重要的方法进行详细介绍。
(1)Abort()方法
在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
语法:
public void Abort ()
通常在关闭线程时调用该方法。
(2)Jion ()方法
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到某个线程终止为止。
语法:
public void Join ()
使用此方法确保线程已终止。如果线程不终止,则调用方将无限期阻止。
(3)Sleep ()方法
将当前线程挂起指定的时间。
语法:
public static void Sleep (int millisecondsTimeout)
参数millisecondsTimeout 是指线程被阻止的毫秒数。指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。指定 Infinite 以无限期阻止线程。
(4)Start()方法
使线程被安排进行执行。
语法:
public void Start ()
此方法通常用来启动一个线程,但线程一旦终止,它就无法通过再次调用 Start 来重新启动。