我的 WCF 服务使用 netTcpBinding,并且有一个回调对象。
我需要为多个并发客户端提供服务,并维护会话,因此服务装饰有
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
为了避免线程死锁,回调类用
[CallbackBehavior(UseSynchronizationContext=false)]
我用来SynchronizationContext
在 UI 线程中执行该方法。
问题是有时通道 gest 无缘无故关闭(ICommunicationObject.Closing
事件被触发)。之后,我在任何后续服务调用中都会遇到异常。
查看跟踪文件,最后一条消息是回调调用,但是,回调方法永远不会被调用。没有例外。
经过一些调试后,我发现只有在同步操作中间进行回调调用时才会发生这种情况。步骤是这样的:
- 调用服务
A
方法IsOneWay=true
- 调用服务
B
方法IsOneWay=false
A
调用回调方法,但B
仍在执行。
这应该不是问题,因为回调有UseSynchronizationContext=false
,因此回调调用可以在单独的线程中进行。
我无法在更简单的情况下重现该问题。在一个简单的项目中按照这些步骤成功执行。
对可能发生的事情或如何识别问题有任何想法吗?