ManualResetEvent是否可以取代布尔值

问题描述:

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

OK,具体:我有一个工作线程当满足下列条件为真应处理消息:

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

的“客户端“和”收件人“连接是其他线程正在监视的TCP套接字;当连接状态改变时,相应的WaitHandle将被设置(连接)或重置(断开)。

最初,我有一个布尔值表示连接状态(用于UI)。现在我正在使用WaitHandles来发信号通知工作线程,看起来有利于完全消除布尔状态变量并仅使用WaitHandles。

waitEvent.WaitOne(0) 

返回手柄的状态,而不会阻塞,使其在功能上等同于测试一个布尔值(与线程安全操作的额外优点)。

因此,鉴于我已经将要使用WaitHandles,并且我不喜欢将状态(相同的语义含义)维护成两个不同变量的想法,我有什么理由不能使用WaitHandles?我能想到的最重要的反驳是运行时性能:测试布尔与时间来测试WaitHandle的时间;但我认为业绩不会受到显着影响。

我错过了什么重要的吗?

谢谢!

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

你必须问这个开销是否足够大,足以证明在两个地方跟踪同一个状态并使它们失去同步的风险。

+0

我的想法。在所有其他条件都相同的情况下,我倾向于认为运行时间性能差异不值得在我从现在开始的6到12个月内更新设计时出现混乱的风险。 – 2012-01-09 19:13:49

+0

我想你已经回答了你自己的问题。不,我不介意让我的答案或任何东西的额外代表:) – FMM 2012-01-09 21:58:20

+0

是的,但我认为这是值得一个“理智检查”,以防万一我失去了一些东西。作为一名独立开发人员,我经常错失与其他有经验的开发人员合作的机会;所以你已经赢得了额外的代表。 – 2012-01-10 18:33:41

有多种办事方式。这是其中的一种情况。假设您正确使用布尔值,应该没有区别。一个考虑因素是内存(对象需要更多的布尔值),但最可能的是很小的。我会推荐一个,但是因为你使用线程来表示事件,所以我会建议WaitHandles,因为这些是他们设计的目的。