代码改变世界

C# 线程手册 第二章 .NET 中的线程

2012-01-07 14:32  DanielWise  阅读(2858)  评论(4编辑  收藏  举报

概述

在第一章我们描述了什么是线程。我们讲述了很多人可能已经很熟悉的背景知识。知道了线程的哪部分最重要。在这一章,你将看到如何实现一些基本的线程;然而了解何时使用线程相对知道基本实现来说更重要一些。

在这章的最后,你将了解:

1. System.Threading 命名空间。

2. 使用线程时有什么设计问题?

3. 线程使用什么资源?

4. 使用线程时要避免什么错误?

 

System.Threading 命名空间

我们已经说过托管代码中的线程由一个System.Threading线程类实例。在这部分,我们将进一步讨论System.Threading命名空间和它的内容。

System.Threading命名空间的类在下表中列出。

描述

AutoResetEvent

这个事件通知一个或者多个正在等待的线程事件已经发生。

Interlocked

这个类通过为由多个线程共享的变量提供原子操作来避免发生错误。

ManualResetEvent

当通知一个或者多个等待的线程已经发生一个事件时发生。

Monitor

这个类提供一个同步访问对象的架构。

Mutex

为一个线程提供共享资源独占访问的一个同步原型。也可用于内部进程同步。

ReaderWriterLock

定义一个允许单写-多读语法。

RegisteredWaitHandle

这个类表示一个当调用RegisterWaitForSingleObject()方法注册的句柄。

SynchronizationLockException

当一个同步方法从一个异步代码块调用的时候抛出这个异常。

Thread

这个类创建并控制一个线程,设置线程优先级并获取其状态。

ThreadAbortException

当调用Abort()方法时抛出这个异常。

ThreadExceptionEventArgs

为ThreadException事件提供数据。

ThreadInterruptedException

当线程处于wating状态时的异常中断会导致这个异常。

ThreadPool

这个类提供一个可以用来执行工作,处理异步I/O,等待其他线程以及处理定时器的线程池。

ThreadStateException

当方法调用的时候且线程处于一个不合法的状态时抛出这个异常。

Timeout

这个类简单地包含了一个我们想要确定特定时间的常量。

Timer

这个类提供在特定间隔中执行方法的结构。

WaitHandle

这个类将等待对一个共享资源独享访问的操作系统对象封装起来。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

我们不会在这部分所有的类,但是知道这个命名空间为我们提供了哪些类是很重要的。其他类将会在后续章节讨论。

线程类

到目前为止,我们将要重点讨论线程类,因为这个类表示了我们使用的进程。这个类允许我们做很多事情,从管理一个线程的优先级到读线程的状态。

让我们从查看这个类的公共方法的表格开始。

公共方法名 描述
Abort() 这个重载方法在它被调用的线程中引发一个ThreadAbortException, 并开始终止线程的过程。调用这个方法通常会终止线程。
AllocateDataSlot() 这个静态方法在所有线程上分配一个未命名的数据槽。
AllocateNamedSlot() 这个静态方法在所有线程上分配一个命名的数据槽。
FreeNamedDataSlot() 这个静态方法释放一个之前分配的命名数据槽。
GetData() 这个静态方法从当前线程的当前应用程序域特定位置收集数据。
GetDomain() 这个静态方法返回当前线程所属的当前应用程序域。
GetDomainID() 这个静态方法返回一个唯一的应用程序域标志。
GetHashCode() 这个方法作为一个特定类型的哈希函数,适用于哈希算法和数据结构(哈希表)。
GetNamedDataSlot() 这个静态方法寻找一个命名的数据槽。
Interrupt() 这个方法中断状态为WaitSleepJoin的线程。
Join() 这个重载方法阻塞调用线程直到一个线程终止。
ResetAbort() 这个静态方法为当前线程取消Abort()请求。
Resume() 这个方法恢复阻塞的线程。
SetData() 这个静态方法为线程的当前程序域设定数据。
Sleep() 这个静态重载方法按照特定毫秒阻塞当前线程。
SpinWait() 这个静态方法导致一个线程等待由迭代参数定义的时间。
Start() 这个方法会导致操作系统将当前线程的状态置成ThreadState.Running.
Suspend() 这个方法会阻塞线程,如果当前线程已经阻塞,会不起作用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

现在让我们看看另外一张表,这次包含了线程的公共属性。

公共属性名 描述
ApartmentState 或者或者设置当前线程的单元状态。
CurrentContext 这个静态属性获取正在执行的线程的上下文。
CurrentCulture 获取或者设置当前线程的文化背景。
CurrentPrincipal 这个静态属性获取或设置线程当前的身份。对基于角色的安全很重要。
CurrentThread 这个静态属性获取当前正在运行的线程。
CurrentUICulture 在运行时使用,这个属性被资源管理器用来寻找特定文化资源。
IsAlive 获取当前线程执行状态值。
IsBackground 获取或设置当前线程是不是后台线程。
IsThreadPoolThread 获取当前线程是不是一个线程池的一部分。
Name 获取或者设置当前线程名。
Priority 获取或者设置一个线程的执行优先级。
ThreadState 获取当前线程的状态。

 

 

 

 

 

 

 

 

 

 

 

 

再次,我们不会在这一章使用所有公共属性。我们已经看过了这些类成员,但是除了我们使用它们创建一个线程否则对我们来说它们没什么用。所以下一篇我们将会创建一个简单的C#线程示例。