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

时间:2012-01-15 13:51:11

标签: c# multithreading wcf oop

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

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

2 个答案:

答案 0 :(得分:3)

如果您对解决方案的唯一问题是其所谓的非OOP-edness",您可以转而使用Singleton Pattern。对于必须具有需要在系统的多个部分之间共享的类的单个实例的情况,这是一种广泛使用的模式。这种模式仍然存在争议,因为有些人认为它是全球变量的美化版本,但它可以有效地完成工作。

答案 1 :(得分:0)

将侦听来自其他服务器的传入消息的单独线程封装到Class MyCustomService中。

编写WCF服务实现类,其行为为concurrencyMode multiple和I​​nstanceContextMode Single

在WCF服务实现类中编写事件delagate。委托将返回MyCustomService类的类型。

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

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