在C#和WCF中的线程之间共享对象

本文关键字:线程 之间 共享 对象 WCF | 更新日期: 2023-09-27 18:20:25

我有一个服务器,它公开了一个SOAP WCF服务端点。该服务器还使用名为Ensemble的组通信框架(与问题无关),以便与同一集群中的其他服务器进行通信。

我需要在侦听来自其他服务器的传入消息的独立线程和调用WCF例程时运行WCF例程的线程之间共享对象/数据。到目前为止,我做了我能想到的最简单的事情——我创建了一个带有静态成员和静态方法的静态"数据库"类——并使用lock()进行同步。通过这种方式,我可以从服务器和组通信线程访问这个类。我的问题是,它有点打破了整个"OOP的东西",我认为这里可以做一些更聪明的事情。。。

在C#和WCF中的线程之间共享对象

如果解决方案的唯一问题是所谓的"非OOP性",那么您可以选择Singleton模式。这是一种广泛使用的模式,适用于必须具有一个类的单个实例的情况,该实例需要在系统的多个部分之间共享,否则这些部分将断开连接。这种模式仍然存在一些争议,因为有些人认为它是一个全局变量的美化版本,但它在完成任务方面是有效的。

将监听来自其他服务器的传入消息的独立线程封装到一个class中,比如MyCustomService。

编写WCF服务实现类,其行为为concurrentyMode multiple和InstanceContextMode Single

在WCF服务实现类中编写一个事件延迟门。委托将返回MyCustomService类的类型。

当您以编程方式实例化WCF服务(host.Open)时,在此之前,请将委托设置为将返回MyCustomService实例的函数,该实例可以是singleton或static。

从服务实例类中,您可以始终调用委托以获取MyCustomService实例。不过,请检查是否为null。