c# - Singleton vs PrEcision vs PerCall 状态管理

标签 c# wcf state

我有一个正在传输大文件的 WCF 服务。

目前我正在使用单例服务和我类中的实例列表来保存状态并响应客户端对传输进度的请求等等。

实例化类本身在需要时为每次传输处理新线程。

添加传输请求和请求进度的客户端可以同时断开连接并在随机时间重新连接。

还有几个不同的客户端可能想要请求所有正在进行的传输的进度。

目前一切正常,但我确定有更好的方法吗?

在 SQL 中以某种方式存储状态? 像我目前正在做的那样存储状态并以某种方式重新连接到同一个实例?那么如何获取所有实例的数据呢?

我希望你能理解我相当长的问题:)

最佳答案

如果您的 WCF 服务只有一个实例,您的解决方案会很有效。

当您使用负载均衡实例化超过 1 个实例时,该方法将不起作用。
在这种情况下,您需要保持状态是所有实例共有的某个地方。它可以是 SQL、状态服务器、另一个可以保持状态的 WCF 服务等。

更新:
您需要为每个文件传输任务生成 id。然后 Singletone 可以将 id 与执行传输的实例相关联(我们称之为 Executor)。
当客户端想要获取进度或取消传输时,它会请求 Singleton 并提供任务 ID。
Singletone 应该使用 task id 来解析实际的 Executor 并将 client 的请求转发给正确的 Executor。

因此,您将能够根据需要实例化任意数量的执行器。客户端不应该担心究竟是哪个 Executor 处理文件。客户应该知道的一切都是任务 ID。

关于c# - Singleton vs PrEcision vs PerCall 状态管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13515973/

相关文章:

c# - 如何在 C# 中重置单例实例?

wcf - 将 Ninject/Ninject WCF 扩展升级到最新版本 3.0.0.5

asp.net - iisreset之后无法启动应用程序池

redux - 有状态的小部件在 Redux/Flutter 应用程序中有意义吗?

c# - 锁定程序/进行试用的序列号?

c# - 如何解决 Enumerable 和 MoreLINQ 之间不明确的 ZIP 调用?

c# - Mono 2.8.2 和加载 PNG 文件

wcf - 在运行时更改使用基本身份验证的 OData/WCF 数据服务的连接字符串

uml - 有条件转移的有限状态机可以表示为马尔可夫链吗?

angularjs - 使用 stateProvider angularjs 的具有多个可选参数的 URL