【问题标题】:Can ManualResetEvent be used to supersede a booleanManualResetEvent 可以用来取代布尔值吗
【发布时间】:2012-01-10 02:29:36
【问题描述】:

这无疑是一个不寻常的问题;我绝不会建议在典型的 .NET 开发中用 ManualResetEvent 替换布尔值。在这种情况下,我已经需要一个 ManualResetEvent 来指示与另一个线程的连接状态;鉴于此,在我看来,使用具有相同语义含义的布尔值是多余的。

好的,具体说明:我有一个工作线程应该在满足以下条件时处理消息:

  • “客户端”已连接
  • “收件人”已连接

“客户端”和“接收者”连接是其他线程正在监视的 TCP 套接字;当任一连接状态发生变化时,对应的 WaitHandle 将被设置(Connected)或重置(Disconnected)。

最初,我有一个布尔值表示连接状态(用于 UI)。现在我正在使用 WaitHandles 向工作线程发出信号,完全消除布尔状态变量并只使用 WaitHandles 似乎是有利的。

waitEvent.WaitOne( 0 )

在没有阻塞的情况下返回句柄的状态,使其在功能上与测试布尔值相同(具有线程安全操作的附加优势)。

所以,鉴于我已经要使用 WaitHandles,并且我不喜欢将状态(相同的语义含义)维护到两个不同的变量中的想法,有什么理由我不能只使用等待句柄?我能想到的最重要的反驳论点是运行时性能:测试布尔值的时间与测试 WaitHandle 的时间;但我认为性能不会受到太大影响。

我在这里遗漏了什么重要的东西吗?

谢谢!

【问题讨论】:

    标签: c# .net thread-safety waithandle


    【解决方案1】:

    仅使用ManualResetEvent 的好处是您只有一个变量跟踪相同的状态。但是,正如您所提到的,读取状态会产生开销。

    您必须询问这种开销是否足够大,足以证明在两个地方跟踪相同状态并冒它们变得不同步的风险。

    【讨论】:

    • 我的想法完全正确。在所有其他条件相同的情况下,我倾向于认为运行时性能差异不值得在 6 到 12 个月后更新此设计时冒着搞砸设计的风险。
    • 我想你已经回答了你自己的问题。我并不介意为我的答案或任何东西获得额外的代表:)
    • 是的,但我认为值得进行“健全性检查”,以防我遗漏了什么。作为一名独立开发人员,我经常错过与其他有经验的开发人员一起讨论架构的机会;所以你已经赢得了额外的代表。
    • 这就是一个聪明的开发者独立工作的困境。很高兴我们有无限的数字货币供应来换取编程帮助。谢谢,祝你好运!
    【解决方案2】:

    有多种做事方式。这是其中一种情况。假设您正确使用布尔值,应该没有区别。一个考虑因素是内存(对象比布尔值多),但很可能是微不足道的。我会推荐任何一个,但由于您使用线程来发出事件信号,因此我建议使用 WaitHandles,因为它们就是它们的设计目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多