阅读量:0
ManualResetEvent
是 C# 中的一个同步原语,用于控制多个线程对共享资源的访问。它有两种状态:Set
和 Reset
。
- Set 状态:当
ManualResetEvent
的状态为Set
时,表示事件已经被触发,等待的线程可以继续执行。一旦一个线程调用了Set
方法,事件就会保持Set
状态,直到另一个线程调用Reset
方法将其重置为Reset
状态。 - Reset 状态:当
ManualResetEvent
的状态为Reset
时,表示事件尚未触发,等待的线程需要继续等待。调用Reset
方法会将事件的状态从Set
改为Reset
,直到另一个线程调用Set
方法将其设置为Set
状态。
管理 ManualResetEvent
状态的关键是正确地使用 Set
和 Reset
方法。以下是一些示例代码:
// 创建一个 ManualResetEvent 实例,初始状态为未触发(false) ManualResetEvent manualResetEvent = new ManualResetEvent(false); // 线程 1:等待事件触发 manualResetEvent.WaitOne(); // 当前线程会阻塞,直到事件被设置为已触发状态 // 线程 2:触发事件 manualResetEvent.Set(); // 事件被设置为已触发状态,线程 1 可以继续执行 // 线程 3:等待事件触发 manualResetEvent.WaitOne(); // 当前线程会阻塞,直到事件被设置为已触发状态
在上面的示例中,manualResetEvent
的状态在 Set
和 Reset
方法之间进行了切换,以控制线程的执行流程。
需要注意的是,在使用 ManualResetEvent
时要避免出现死锁的情况。确保在调用 WaitOne
方法之前已经正确地调用了 Set
方法,并且在不需要等待事件时及时调用 Reset
方法将其重置为未触发状态。
此外,还可以使用 ManualResetEventSlim
类,它是 ManualResetEvent
的一个更轻量级的替代品,提供了类似的功能,但具有更简单的 API 和更好的性能特性。