我使用this示例来实现WCF服务,该服务在服务上发生事件时向所有客户端触发事件(使用回调)。
问题是此示例仅在服务实例是percall时才有效。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)]
我想使用单个实例但它不起作用。
它将所有事件发送到最后订阅的客户端。
请帮忙。
答案 0 :(得分:3)
示例有InstanceContextMode.PerSession
,而不是InstanceContextMode.PerCall
。每个订阅的客户端都与MyService
的单独实例相关联。这些实例中的每一个都有一个成员字段_callbackInstance
,该字段保存对其特定客户端的回调通道的引用。 MyService
的所有实例都通过静态事件Broadcast
关联到“聊天室”,当特定客户端说出某些内容时,代码会迭代静态事件的调用列表以向每个实例广播订阅客户。
如果您将MyService
设为单身,_callbackInstance
仅包含最后订阅的客户端的回调频道,这就是您看到所描述行为的原因。
为了使服务类作为单例实例正常运行,您必须将_callbackInstance
替换为包含订阅客户端的所有回调通道的集合,并自行管理此集合中的添加和删除当客户到达并离开时。然后广播将涉及迭代此集合。这种方法的缺点是多个客户端可能同时调用服务,因此您需要显式同步对类成员的访问,以确保线程安全和正确的行为。
答案 1 :(得分:2)
感谢Chris,我发现this示例显示了在使用InstanceContextMode.Single
时如何处理多个回调订阅者。
示例显示如何管理回调的字典(列表也可以)通道。
有约色。