这无疑是一个不寻常的问题;我绝不会建议在典型的.NET开发中用ManualResetEvent替换布尔值。在这种情况下,我已经需要一个ManualResetEvent来指示另一个线程的连接状态;鉴于此,我发现使用具有相同语义含义的布尔值是多余的。
好的,具体:我有一个工作线程,当满足以下条件时,它应该处理消息:
“客户端”和“收件人”连接是其他线程正在监视的TCP套接字;当任一连接状态改变时,相应的WaitHandle将被设置(已连接)或重置(已断开连接)。
最初,我有一个布尔表示连接状态(用于UI)。既然我正在使用WaitHandles来通知工作线程,那么完全消除布尔状态变量并使用WaitHandles似乎是有利的。
waitEvent.WaitOne( 0 )
返回句柄的状态而不会阻塞,使其在功能上与测试布尔值相同(具有线程安全操作的额外优势)。
所以,鉴于我已经要使用WaitHandles了,我不喜欢将状态(相同的语义)维护成两个不同的变量的想法,有什么理由我不能只使用WaitHandles?我能想到的最重要的反驳论点是运行时性能:测试布尔值的时间与测试WaitHandle的时间的关系;但我认为表现不会受到太大影响。
我在这里遗漏了什么重要的东西吗?
谢谢!
答案 0 :(得分:0)
有多种做事方式。这是其中一个案例。假设您正确使用布尔值,应该没有区别。一个考虑因素是内存(对象需要多一个布尔值)但很可能是微不足道的。我推荐的任何一个,但由于你使用线程来发出信号事件,我会建议WaitHandles,因为这些是他们的目的。
答案 1 :(得分:0)
仅使用ManualResetEvent
的好处是您只有一个变量跟踪相同的状态。但是,正如您所提到的,将状态释放回来。
你必须要问这个开销是否足以证明在两个地方跟踪相同的状态并冒着失去同步的风险。