【发布时间】:2015-04-26 10:12:14
【问题描述】:
我有一个处理客户端 (WPF) 之间通信的 WCF 服务(托管在 WPF 应用程序中)。有一种情况,一个客户端向服务发送消息,服务将消息广播给其他客户端,但该消息导致另一个客户端发回一条新消息,并且它们都冻结了。经过一番阅读,我怀疑第二个客户端尝试调用服务,而服务的调用仍未完成(使用相同的通道)。但是,我不确定我的假设是否正确,如果正确,如何克服它。
更详细一点:客户端是文本编辑器。如果您写入一个,表示更改的操作将发送到服务并从那里发送到其他客户端。但是,当我尝试发送有关其他人的插入符号移动的操作时,它会冻结。我认为这是因为第二个客户端接收到的 InsertOperation 会导致插入符号移动,并且它会尝试在事件处理程序中发送 CaretMoveOperation ,使用服务用于发送消息的同一通道进行调用,从而导致死锁。
你怎么看?你能提出一些建议吗?
【问题讨论】:
-
你设置的服务行为并发模式是什么[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
-
回调行为设置为
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)],服务行为设置为[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]