C#面试题更新 2026-08-03

C# 中 AutoResetEvent 和 ManualResetEvent 都用于线程同步,它们在控制线程执行时的核心区别是什么?请说明各自的工作机制和典型使用场景。

考察说明

考查对 C# 线程同步原语中 AutoResetEvent 与 ManualResetEvent 工作机制差异的理解。

回答思路

  1. 【回答框架 1】AutoResetEvent 与 ManualResetEvent 都是基于内核事件的同步构造,用于线程间的信号通知。AutoResetEvent 在接收到 Set 信号后,只允许一个等待线程通过,并自动将事件状态重置为无信号,因此适合一对一的线程唤醒。
  2. 【回答框架 2】ManualResetEvent 在 Set 后保持有信号状态,所有等待线程都能通过,直到手动调用 Reset 才恢复无信号,适合广播唤醒多个线程。
  3. 【回答框架 3】典型使用:AutoResetEvent 常用于生产者消费者模型中每次只放行一个消费者;ManualResetEvent 常用于控制多个工作线程同时开始或停止。
  4. 【回答框架 4】需要注意使用 WaitOne 等方法的超时参数避免无限等待,且事件对象应正确释放资源。
  5. 【回答框架 5】从性能角度看,内核同步对象比自旋或用户态锁开销更大,在竞争激烈时可能影响吞吐,需结合实际场景选择。
  6. 【关键点 1】AutoResetEvent 自动重置为无信号,只放行一个等待线程。
  7. 【关键点 2】ManualResetEvent 需手动 Reset,可放行所有等待线程。
  8. 【关键点 3】WaitOne 支持超时,可避免死锁。
  9. 【关键点 4】同步对象使用后应释放,常见于 using 或 finally 中。
  10. 【易错点 1】混淆两者自动与手动重置行为,导致多线程唤醒语义错误。
  11. 【易错点 2】忘记调用 Reset 使 ManualResetEvent 一直保持有信号,造成意外放行。
  12. 【易错点 3】在事件等待中不处理超时或异常,可能导致线程永久阻塞。