多线程应用程序通常使用等待句柄和监视器对象来同步多个线程。下表介绍了可用于同步线程的部分 .NET 框架类。
类 用途
AutoResetEvent 等待句柄,用于通知一个或多个等待线程发生了一个事件。AutoResetEvent 在等待线程被释放后自动将状态更改为已发出信号。
Interlocked 为多个线程共享的变量提供原子操作。
ManualResetEvent 等待句柄,用于通知一个或多个等待线程发生了一个事件。手动重置事件的状态将保持为已发出信号,直至 Reset 方法将其设置为未发出信号状态。同样,该状态将保持为未发出信号,直至 Set 方法将其设置为已发出信号状态。当对象的状态为已发出信号时,任意数量的等待线程(即通过调用一个等待函数开始对指定事件对象执行等待操作的线程)都可以被释放。
Monitor 提供同步访问对象的机制。Visual Basic .NET 应用程序调用 SyncLock 以使用监视器对象。
Mutex 等待句柄,可用于进程间同步。
ReaderWriterLock 定义用于实现单个写入者和多个读取者的锁定。
Timer 提供按指定间隔运行任务的机制。
WaitHandle 封装操作系统特有的、等待对共享资源进行独占访问的对象。
等待句柄
等待句柄是将一个线程的状态通知另一个线程的对象。线程可以使用等待句柄,通知其他线程它们需要对资源进行独占访问。然后,其他线程必须等到没有线程在使用等待句柄时才能使用此资源。等待句柄有两种状态:已发出信号和未发出信号。不属于任何线程的等待句柄处于已发出信号状态。属于某线程的等待句柄处于未发出信号状态。
线程通过调用一种等待方法(例如 WaitOne、WaitAny 或 WaitAll)来请求等待句柄的所有权。等待方法是与单独线程的 Join 方法相类似的阻塞调用。
如果没有其他线程拥有该等待句柄,则调用将立即返回 True,等待句柄的状态将更改为未发出信号,而拥有等待句柄的线程将继续运行。
如果线程调用了等待句柄的一种等待方法,但该等待句柄归另一线程所有,则调用线程将等待指定的时间(如果指定了超时),或者无限期地等待(未指定超时),直至其他线程释放等待句柄。如果指定了超时,并且在超时到期前释放等待句柄,则调用返回 True。否则,调用返回 False,并且进行调用的线程将继续运行。
拥有等待句柄的线程在运行结束后,