我的WCF服务使用netTcpBinding,并且有一个回调对象。WCF双工通道在使用回调函数时关闭
我需要服务多个并发客户端,和十个分量会议,所以服务上装饰有
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
为了避免线程死锁,回调类装饰有
[CallbackBehavior(UseSynchronizationContext=false)]
我用SynchronizationContext
在UI线程中执行该方法。
问题是,有时频道的关闭无意义(ICommunicationObject.Closing
事件被触发)。之后,我在任何后续服务电话中都会收到例外情况。
查看跟踪文件,最后一条消息是回调函数,但是回调函数永远不会被调用。没有例外。
经过一些调试后,我发现只有在同步操作中间进行回调调用时才会发生这种情况。具体的步骤是这样的:
- 呼叫服务方法
A
与IsOneWay=true
- 呼叫服务方法
B
与IsOneWay=false
A
调用回调方法,但B
仍在执行。
这应该不是问题,因为回调有UseSynchronizationContext=false
,所以回调调用可以在单独的线程中处理。
我无法在更简单的情况下重现问题。在一个简单的项目中执行这些步骤将成功执行
任何想法可能发生什么或如何识别问题?
代码片段可能会从客户端和服务端受益。 – Perpetualcoder 2009-11-18 15:57:31