已触发过Wait调用的ManualResetEvent无新Set时再次调用Wait会发生什么
ManualResetEvent 重复调用 Wait 方法的行为结果
核心结论
只要你没有主动调用Reset()方法,后续所有Wait()调用都会立刻返回,不会阻塞线程。
原理说明
ManualResetEvent 是手动重置同步事件,它的状态切换完全由开发者手动控制:
- 调用
Set()后,事件会永久保持有信号状态,不会像AutoResetEvent那样自动重置为无信号 - 只有显式调用
Reset()时,事件才会切换回无信号状态,此时Wait()才会触发线程阻塞
代码验证示例
// 初始化默认处于无信号状态的ManualResetEvent实例 ManualResetEvent mre = new ManualResetEvent(initialState: false); // 首次调用WaitOne,事件无信号,线程阻塞 mre.WaitOne(); // 调用Set将事件设为有信号,阻塞的线程恢复运行 mre.Set(); // 未再次调用Set,第二次调用WaitOne:事件仍处于有信号状态,立刻返回,无阻塞 mre.WaitOne(); // 手动调用Reset将事件切回无信号 mre.Reset(); // 第三次调用WaitOne:事件无信号,线程再次进入阻塞状态 mre.WaitOne();
关键注意点
不要混淆ManualResetEvent和AutoResetEvent的行为:AutoResetEvent的Set()调用仅会放行1次等待,之后自动重置为无信号,而ManualResetEvent不存在自动重置逻辑。
内容的提问来源于stack exchange,提问作者bpeikes
相关产品推荐
相关产品推荐

