VB.NET并行与分布式编程(6)-线程与内核同步[3]
一、 WaitHandle 类封装等待对共享资源的独占访问的操作系统特定的对象
1)WaitHandle 类型公开以下成员。
构造函数
--------------------------------------------------------------------------------
名称 说明
WaitHandle 初始化 WaitHandle 类的新实例。
页首
属性
--------------------------------------------------------------------------------
名称 说明
Handle 已过时。获取或设置本机操作系统句柄。
SafeWaitHandle 获取或设置本机操作系统句柄。
页首
方法
--------------------------------------------------------------------------------
名称 说明
Close 在派生类中被重写时,释放由当前 WaitHandle 持有的所有资源。
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。)
Dispose() 释放由 WaitHandle 类的当前实例使用的所有资源。
Dispose(Boolean) 在派生类中被重写时,释放由 WaitHandle 使用的非托管资源,也可以根据需要释放托管资源。
Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。)
GetType 获取当前实例的 Type。 (继承自 Object。)
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。)
MemberwiseClone() 创建当前 Object 的浅表副本。 (继承自 Object。)
MemberwiseClone(Boolean) 创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。)
SignalAndWait(WaitHandle, WaitHandle) 向一个 WaitHandle 发出信号并等待另一个。
SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) 向一个 WaitHandle 发出信号并等待另一个,指定超时间隔为 32 位有符号整数,并指定在进入等待前是否退出上下文的同步域。
SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) 向一个 WaitHandle 发出信号并等待另一个,指定超时间隔为 TimeSpan,并指定在进入等待前是否退出上下文的同步域。
ToString 返回表示当前对象的字符串。 (继承自 Object。)
WaitAll(WaitHandle[]) 等待指定数组中的所有元素都收到信号。
WaitAll(WaitHandle[], Int32) 等待指定数组中的所有元素接收信号,同时使用 Int32 值指定时间间隔。
WaitAll(WaitHandle[], TimeSpan) 等待指定数组中的所有元素接收信号,同时使用 TimeSpan 值指定时间间隔。
WaitAll(WaitHandle[], Int32, Boolean) 等待指定数组中的所有元素收到信号,使用 Int32 值指定时间间隔,并指定是否在等待之前退出同步域。
WaitAll(WaitHandle[], TimeSpan, Boolean) 等待指定数组中的所有元素收到信号,使用 TimeSpan 值指定时间间隔,并指定是否在等待之前退出同步域。
WaitAny(WaitHandle[]) 等待指定数组中的任一元素收到信号。
WaitAny(WaitHandle[], Int32) 等待指定数组中的任意元素接收信号,同时使用 32 位带符号整数指定时间间隔。
WaitAny(WaitHandle[], TimeSpan) 等待指定数组中的任意元素接收信号,同时使用 TimeSpan 指定时间间隔。
WaitAny(WaitHandle[], Int32, Boolean) 等待指定数组中的任一元素收到信号,使用 32 位带符号整数指定时间间隔并指定是否在等待之前退出同步域。
WaitAny(WaitHandle[], TimeSpan, Boolean) 等待指定数组中的任一元素收到信号,使用 TimeSpan 指定时间间隔并指定是否在等待之前退出同步域。
WaitOne() 阻止当前线程,直到当前 WaitHandle 收到信号为止。
WaitOne(Int32) 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔。
WaitOne(TimeSpan) 阻止当前线程,直到当前实例收到信号,同时使用 TimeSpan 指定时间间隔。
WaitOne(Int32, Boolean) 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。
WaitOne(TimeSpan, Boolean) 使用 TimeSpan 指定时间间隔并指定是否在等待之前退出同步域,以此阻止当前线程,直到当前的实例收到信号。
二、AutoResetEvent 类
AutoResetEvent 允许线程通过发信号互相通信。 通常,当线程需要独占访问资源时使用该类。
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。 如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。 AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。 如果没有任何线程在等待,则状态将无限期地保持为终止状态。
如果当 AutoResetEvent 为终止状态时线程调用 WaitOne,则线程不会被阻止。 AutoResetEvent 将立即释放线程并返回到非终止状态。
重要事项
不能保证对 Set 方法的每次调用都释放线程。 如果两次调用十分接近,以致在线程释放之前便已发生第二次调用,则只释放一个线程。 就像第二次调用并未发生一样。 另外,如果在调用 Set 时不存在等待的线程且 AutoResetEvent 已终止,则该调用无效。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态:如果初始状态为终止状态,则为 true;否则为 false。
AutoResetEvent 也可以同 staticWaitAll 和 WaitAny 方法一起使用。
有关线程同步机制的更多信息,请参见概念文档中的 AutoResetEvent。
从 .NET Framework 2.0 版开始,AutoResetEvent 从新的 EventWaitHandle 类派生。 AutoResetEvent 在功能上等效于用 EventResetMode.AutoReset 创建的 EventWaitHandle。
注意
与 AutoResetEvent 类不同的是,EventWaitHandle 类提供对已命名的系统同步事件的访问。
三、AutoResetEvent的几个重要知识点
1)构造函数
AutoResetEvent 构造函数的参数initialState为System.Boolean类型
若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false。
2)方法
Reset将事件状态设置为非终止状态,导致线程阻止。(继承自EventWaitHandle。)
Set将事件状态设置为终止状态,允许一个或多个等待线程继续。(继承自EventWaitHandle。)
SetAccessControl设置已命名的系统事件的访问控制安全性。(继承自EventWaitHandle。)
WaitOne阻止当前线程,直到当前WaitHandle收到信号为止。(继承自WaitHandle。)
上一篇: 并发带来的冲突