ManualResetEvent
是 C# 中的一個同步原語,它提供了一種方式,使得多個線程可以等待某個事件的發(fā)生。ManualResetEvent
的名字中的 “manual” 指的是這個事件的狀態(tài)(是否被重置)是由代碼來控制的,而不是由事件自動完成的。
ManualResetEvent
的基本用法如下:
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
// 線程1:等待事件發(fā)生
manualResetEvent.WaitOne();
// 線程2:設置事件狀態(tài),喚醒等待的線程
manualResetEvent.Set();
在這個例子中,ManualResetEvent
初始化為 false
,表示事件的初始狀態(tài)是不發(fā)生的。線程1調用 WaitOne
方法時,它會阻塞,直到事件被設置為 true
。線程2調用 Set
方法時,它會設置事件的狀態(tài)為 true
,從而喚醒等待的線程1。
需要注意的是,如果多個線程在調用 WaitOne
方法時被阻塞,那么當線程2調用 Set
方法時,只有其中一個線程會被喚醒。其他線程仍然會保持阻塞狀態(tài),直到它們再次調用 WaitOne
方法。這是因為 ManualResetEvent
只會喚醒一個等待的線程。
另外,ManualResetEvent
還提供了一個 Reset
方法,用于將事件的狀態(tài)重置為 false
。這樣,當被喚醒的線程再次調用 WaitOne
方法時,它會發(fā)現(xiàn)事件仍然處于未發(fā)生的狀態(tài),并再次進入阻塞狀態(tài)。
總的來說,ManualResetEvent
的等待機制是一種基于事件的同步機制,它允許多個線程等待某個事件的發(fā)生,并在事件發(fā)生時喚醒等待的線程。