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
的等待機制是一種基于事件的同步機制,它允許多個線程等待某個事件的發生,并在事件發生時喚醒等待的線程。