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

时间:2015-02-24 16:56:33

标签: c# .net wpf wcf

我有一个WCF服务(托管在WPF应用程序中),用于处理客户端(WPF)之间的通信。这是一个场景,其中一个客户端向servuce发送消息,该消息将其广播到其他客户端,但消息导致另一个客户端发回新消息并且它们都冻结。经过一些阅读后,我怀疑第二个客户端尝试拨打服务,而服务的呼叫仍然没有完成(使用相同的频道)。但是,我不确定我的假设是否正确,如果是这样,如何克服它。

更详细一点:客户端是文本编辑器。如果您编写一个,则表示更改的操作将发送到服务,并从那里发送到其他客户端。当我尝试发送关于其他人的操作时#39;虽然插入符号,它冻结了。我假设它是因为第二个客户端接收的InsertOperation导致插入符号移动并且它尝试在事件处理程序中使用服务用于发送消息的相同通道发送CaretMoveOperation,从而导致死锁。

你怎么看?你能提出一些建议吗?

2 个答案:

答案 0 :(得分:0)

我会检查两件事

  1. 是您拨打电话时应用程序的CPU级别?你是否得到一个无限循环,给出一个锁的外观?
    1. 您是否正在使用等待终止的同步消息?因为那样你就会进入一个循环。确保您没有使用同步操作回调同一个线程。您应该使用异步消息传递设计,可能使用事件处理程序中的单独任务

答案 1 :(得分:0)

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

摘自MSDN


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