You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已触发过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:57:03