【发布时间】:2012-08-30 19:15:03
【问题描述】:
我有一个 WCF 双工服务,它带有一个名为 GetList 的 2 路方法,以及一个单路回调方法 ItemUpdated。
我在以下情况中检测到死锁:
- 服务调用 ItemUpdated 回调,在客户端由 OnItemUpdated 方法处理。
- 在上一个方法返回之前,一些用户交互导致客户端调用服务上的 GetList。
我可以将我的服务的 ConcurrencyMode 设置为 Reentrant,但这不是我需要的。我需要确保我的客户端在调用 GetList 之前没有处理来自服务的任何回调。
所以我可以同步锁定一个对象以确保不会发生这种情况。这是我更好的选择吗?
更新:
只是为了澄清我当前的设计是什么,我的服务实际上是一个 Windows 服务,它按计划对对象列表进行一些处理,当每个项目更新时,它会引发事件 ItemUpdated。该服务有一个 WCF 服务外观,它允许一个或多个控制台(客户端)订阅其事件并查看服务中发生了什么。
【问题讨论】:
-
你现在的 ConcurrencyMode 和 InstanceMode 是什么?
-
很可能,“锁定”只会让事情变得更糟 :) 像“双向”和“双工”这样的词可能很可怕——你的服务应该被设计为 无状态,如果可能的话。双向消息 - 当然。一台主机上的一件事正在等待另一台主机的某事:请重新访问您设计的协议。 肯定查看 ErnieL 的回复,并阅读他发布的链接。这是个好建议,恕我直言...
-
@paulsm4:我更新了我的问题以澄清我当前的设计。正如我在那里提到的,我的服务是 Windows 服务,因此它不能真正是无状态的。另外,我看不出双向(相对于单向)方法有多可怕。我承认双工服务更难设计和维护,如何将它们用于提供者-订阅者模式可能是一个值得商榷的决定。