1

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

好的,细节:我有一个工作线程应该在以下条件为真时处理消息:

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

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

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

waitEvent.WaitOne( 0 )

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

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

我在这里错过了什么重要的东西吗?

谢谢!

4

2 回答 2

0

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

于 2012-01-09T17:29:29.073 回答
0

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

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

于 2012-01-09T18:29:36.690 回答