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

标签 c# .net wcf

我一直在研究 WCF 中的实例化和并发模式,我试图了解是否有任何情况可以使用 PerCall 实例化和 Reentrant 并发。在下面MSDN link声明“在 PerCall 实例化中,并发性不相关”。

The use of concurrency is related to the instancing mode. In PerCall instancing, concurrency is not relevant, because each message is processed by a new InstanceContext and, therefore, never more than one thread is active in the InstanceContext.

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

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

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

那么,为什么 Microsoft 说并发与 PerCall 模式无关?

最佳答案

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

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

这就是声明的原因,“在 PerCall 实例中,并发性不相关”

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

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

因此,为了使双工 MEP 成功,它需要在跳转到回调 channel 执行时保持原始服务的实例处于事件状态并可重新进入。使用 percall 实例化,这是不可能的。

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

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

关于c# - 我可以在同一服务中使用 PerCall 实例化和可重入并发吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697005/

相关文章:

c# - 在 C# 中获取在 TextBox 中键入字符之间的时间间隔

c# - 如何在 wpf 中单击 Panel.ZIndex 低于另一个的对象?

c# - 嵌套中继器

c# - Lambda 表达式对比不同的对象

c# - WCF:嵌套的 DataContract 值为空

c# - 存储库、删除对象、模型与 ID

c# - 在 WPF 中为组合框设置默认名称

.net - 如何使用 Linq-to-SQL 只插入新记录?

c# - 使用 MEF 将程序集添加到目录

asp.net-mvc - Azure Web 角色 - 混合 MVC 和 WCF - 最佳实践