我可以在同一服务中使用PerCall实例和重入并发吗?

Bru*_*uno 6 .net c# wcf

我一直在研究WCF中的实例化和并发模式,我试图理解是否有任何使用PerCall实例化和重入并发的情况.在下面的MSDN链接中,声明" 在PerCall实例化中,并发性是不相关的 ".

并发的使用与实例化模式有关.在PerCall实例化中,并发性不相关,因为每个消息都由新的InstanceContext处理,因此InstanceContext中永远不会有多个活动的线程.

但是,我认为可能存在这两种模式(PerCall和Reentrant)必须结合使用的情况.请纠正我和/或给我任何意见.请考虑以下情形:

服务A使用双工MEP.服务A公开一个返回对象的操作合约(即,它不是单向操作).服务的回调契约还公开了一个返回对象的操作契约(即,它不是单向操作).服务端点使用wsDualHttp绑定.

操作契约实现在返回之前调用客户端的回调.在这种情况下,如果我将ConcurrencyMode设置为Single,则会发生死锁,无论是否将ConcurrencyMode设置为Reentrant,一切都按预期工作.

那么,为什么微软说Perconall与PerCall模式无关?

Sar*_*gam 3

并发性与访问服务实例 (InstanceContext) 的线程数有关。

在每次调用实例化中,每次调用都会创建一个新的服务实例及其相关资源,就像在 ASP.Net 中一样。当调用结束时,该实例将无效。此外,任何其他线程都无法访问该实例,即使来自同一会话也是如此。

这就是“在 PerCall 实例中,并发性不相关”这一说法的原因。

关于您的场景,在 Duplex MEP 中,假设 A 是客户端,B 是服务。

当A调用B时,就会创建一个Service的实例。在双工 MEP 中,响应必须通过不同的通道(回调通道)进行,并且执行必须跳转到不同的实例(您在代理创建期间设置的客户端实例)来执行。完成此操作后,它必须跳回原始服务实例并从离开的地方继续。

因此,为了使双工 MEP 成功,当它跳转到回调通道执行时,它需要保持原始服务的实例处于活动状态并可重新进入。对于 percall 实例,这是不可能的。

这就是双工通道寻找可重入/多重并发和 PerSession InstanceContextMode 的原因

另请注意,当您不指定实例上下文模式时,默认为 PerSession。