【问题标题】:Sharing objects between threads in C# and WCF在 C# 和 WCF 中的线程之间共享对象
【发布时间】:2012-01-15 13:51:11
【问题描述】:

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

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

【问题讨论】:

  • 追求 OOP 本身绝不应该是一个目标。
  • 它是如何打破“OOP 事物”的? OOP 没有提及线程和跨线程的对象共享。

标签: c# multithreading wcf oop


【解决方案1】:

如果您的解决方案的唯一问题是其所谓的“非 OOP-edness”,您可以改用 Singleton Pattern。这是一种广泛使用的模式,当您必须有一个类的单个实例需要在系统的多个部分之间共享时,否则这些部分会断开连接。该模式仍然存在一些争议,因为有些人认为它是全局变量的美化版本,但它可以有效地完成工作。

【讨论】:

    【解决方案2】:

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

    编写行为为 concurrencyMode multiple 和 InstanceContextMode Single 的 WCF 服务实现类

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2019-08-11
      相关资源
      最近更新 更多