ManualResetEvent
是 C# 中的一个同步原语,它提供了一种方式,使得多个线程可以等待某个事件的发生。ManualResetEvent
的名字中的 “manual” 指的是这个事件的状态(是否被重置)是由代码来控制的,而不是由事件自动完成的。
ManualResetEvent
的基本用法如下:
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
// 线程1:等待事件发生
manualResetEvent.WaitOne();
// 线程2:设置事件状态,唤醒等待的线程
manualResetEvent.Set();
在这个例子中,ManualResetEvent
初始化为 false
,表示事件的初始状态是不发生的。线程1调用 WaitOne
方法时,它会阻塞,直到事件被设置为 true
。线程2调用 Set
方法时,它会设置事件的状态为 true
,从而唤醒等待的线程1。
需要注意的是,如果多个线程在调用 WaitOne
方法时被阻塞,那么当线程2调用 Set
方法时,只有其中一个线程会被唤醒。其他线程仍然会保持阻塞状态,直到它们再次调用 WaitOne
方法。这是因为 ManualResetEvent
只会唤醒一个等待的线程。
另外,ManualResetEvent
还提供了一个 Reset
方法,用于将事件的状态重置为 false
。这样,当被唤醒的线程再次调用 WaitOne
方法时,它会发现事件仍然处于未发生的状态,并再次进入阻塞状态。
总的来说,ManualResetEvent
的等待机制是一种基于事件的同步机制,它允许多个线程等待某个事件的发生,并在事件发生时唤醒等待的线程。