【发布时间】:2010-12-01 07:41:58
【问题描述】:
首先介绍一下应用场景:
我有一个服务应用程序正在监视某物的状态,同时还有多个应用程序在等待状态更改。一旦状态改变,每个应用程序都会读取状态值(通过一个命名的 FileMap 对象)并执行相应的动作,然后等待状态再次改变。
所以我使用了一个命名的 Event 对象来完成同步工作。所有应用程序都在等待此事件发出信号,并且服务应用程序将在该状态更改时将此事件设置为发出信号。
我需要保证当状态改变时,每个等待的应用都会被释放并且只释放一次!
这两种方法我都试过了
方法一
- 创建手动重置事件;
- 当状态发生变化时,先调用SetEvent,然后立即调用ResetEvent。
方法二
- 创建手动重置事件;
- 当状态改变时,调用PulseEvent。
在测试过程中,这两种方法似乎都运行良好。但我认为它们都不可靠,因为:
对于##方法一##,可能有些等待的线程在调用ResetEvent函数之前没有机会被执行。
对于## Method 2 ##,微软声称PulseEvent is unreliable and should not be used。
这种情况有什么可行的解决方案吗?欢迎任何建议。
【问题讨论】:
-
方法 1 和 2 在概念上几乎相同,因为调用
PulseEvent();几乎就像调用SetEvent(); ResetEvent();。 -
对您来说更重要的是,当状态发生变化时,应用程序会尽快得到通知,或者应用程序不会错过任何一次状态变化?
-
@Dialectus 不错过更重要。一次更改无法通知应用程序 2 次也很重要。
-
当某些应用程序崩溃时,服务是否应该自动从情况中恢复?