ManualResetEvent
是 C# 中的一个同步原语,用于让一个或多个线程等待,直到另一个线程调用 Set
方法来重置事件的状态。你可以通过以下方式通知等待的线程 ManualResetEvent
的状态已经改变:
- 使用
Set
方法:当另一个线程完成其任务并需要通知等待的线程时,它应该调用ManualResetEvent
的Set
方法。这将设置事件的内部状态为true
,从而唤醒所有正在等待该事件的线程。
ManualResetEvent mres = new ManualResetEvent(false); // 线程1:等待事件 mres.WaitOne(); // 这将阻塞线程1,直到mres被设置为true // 线程2:设置事件并通知线程1 mres.Set(); // 这将唤醒线程1
- 使用
Pulse
方法(可选):如果你只想唤醒一个等待的线程,而不是所有等待的线程,你可以使用Pulse
方法。这与Set
方法类似,但它只唤醒一个线程。如果调用Pulse
时没有线程正在等待,那么事件的状态不会改变。
ManualResetEvent mres = new ManualResetEvent(false); // 线程1:等待事件 bool isAwoken = mres.WaitOne(0); // 这将阻塞线程1,直到mres被设置为true或超时 // 线程2:设置事件并通知线程1 if (isAwoken) { mres.Pulse(); // 这将唤醒一个正在等待的线程(在这个例子中是线程1) }
注意:在使用 ManualResetEvent
时,请确保在适当的时候调用 Reset
方法,以便将事件的状态重置为 false
。否则,等待的线程可能会永远阻塞。
mres.Reset(); // 这将把mres的状态重置为false