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