从两个独立的客户端调用服务时WCF死锁



我有一个WCF服务(托管在WPF应用程序中),用于处理客户端(WPF)之间的通信。有一种情况,其中一个客户端向服务器发送消息,服务器将消息广播给其他客户端,但该消息导致另一个客户端发回新消息,而这些消息都冻结了。经过一些阅读,我怀疑第二个客户端试图对服务进行调用,而服务的调用仍然没有完成(使用相同的通道)。然而,我不确定我的假设是否正确,如果是的话,如何克服它

更详细地说:客户端是文本编辑器。如果您在其中写入,则表示更改的操作将发送到服务,并从那里发送到其他客户端。不过,当我尝试发送有关其他插入符号移动的操作时,它会冻结。我认为这是因为第二个客户端接收到的InsertOperation导致插入符号移动,并且它试图将CaretMoveOperation发送回事件处理程序中,该事件处理程序使用与服务发送消息相同的通道进行调用,从而导致死锁。

你觉得怎么样?你能提个建议吗?

我会检查两件事

  1. 当您调用调用时,应用程序的CPU级别是否会飙升?你是不是得到了一个看起来像锁的无限循环?
    1. 您是否使用等待终止的同步消息?因为那样你就会进入一个循环。请确保您没有使用同步操作在同一个线程上进行回调。您应该使用异步消息传递设计,可能是在与事件处理程序分离的任务上

您必须查看您的服务行为属性。当事情看起来一次只处理一条消息时(这可能意味着单线程)。

MSDN 摘录


ConcurrencyMode属性与其他一些设置交互。例如,如果InstanceContextMode值设置为Single,则结果是服务一次只能处理一条消息,除非同时将ConcurrencyMode值也设置为Multiple。此属性还与ServiceContractAttribute.SessionMode属性一起生成行为。有关详细信息,请参阅会话、实例化和并发

最新更新