1

目前我有一类监控串行端口的传入数据,处理数据并根据接收到的数据通过委托/事件引发事件。这是一个独立的应用程序。现在我必须将它转换为服务,以便当 Windows 启动并且客户端应用程序从远程 PC 或本地计算机订阅事件时,串行端口监视器类将作为服务启动。我看过很多关于将 WCF 用于此类应用程序的文章。但是 WCF 是基于消息的,它会在客户端被请求时创建一个服务对象。但我的要求是服务应该自动启动,并且客户端应用程序应该能够订阅在启动期间已经创建的服务类实例的事件。如何使用 WCF 实现这一目标?

4

1 回答 1

1

WCF 中的默认行为是创建服务类的新实例来处理每个传入请求,但您可以通过使用以下内容装饰您的类来覆盖它:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

但是,要使用 Singleton 获得良好的性能,您需要考虑以下几点:

  • 由于您可能需要对 Singleton 实例进行一些配置,因此您可能希望使用将ServiceHostSingleton 实例作为参数的构造函数方法。(例如,请参阅本文中的图 8 初始化和托管单例
  • 线程:默认线程模型 ( ConcurrencyMode) 一次只允许单个线程访问您的 Singleton 实例。您可能需要查看 usingConcurrencyMode = ConcurrencyMode.Multiple以获得良好的性能(这意味着您需要自己处理与线程相关的问题)。
  • 确保将回调合同中的方法标记为,[OperationContract(IsOneWay = true)]以便将事件发布回订阅者不会导致服务实例阻塞,直到事件处理程序完成。( Juval Lowy 的这篇文章详细介绍了以这种方式使用 WCF
于 2012-05-14T12:26:50.450 回答