gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:46:51 26 4
gpt4 key购买 nike

我一直在研究 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com