6

这周我一直在努力跟上命名管道的速度。我试图与他们一起解决的任务是我有一个现有的 Windows 服务,它充当设备驱动程序,将数据从外部设备汇集到数据库中。现在我必须修改这个服务并添加一个可选的用户前端(在同一台机器上,使用一种 IPC 形式),它可以监控设备和数据库之间传递的数据,并将一些命令发送回服务.

我对 IPC 的最初想法是命名管道或内存映射文件。到目前为止,我一直在使用WCF Tutorial Basic Interprocess Communication解决命名管道的想法。我的想法是使用实​​现 WCF NamedPipe 服务的附加线程设置 Windows 服务,并将其用作驱动程序内部的管道。

我的示例代码可以正常工作,但是我无法解决 2 个问题,我希望这里的人可以帮助我:

  1. 在本教程中,ServiceHost 使用 typeof(StringReverser) 实例化,而不是通过引用具体类。因此,似乎没有服务器与服务本身交互的机制(在 host.Open() 和 host.Close() 行之间)。是否可以在服务器和实际实现服务的类之间创建链接并传递信息?如果是这样,怎么做?

  2. 如果我运行服务器的单个实例,然后运行客户端的多个实例,似乎每个客户端都获得了服务类的单独实例。我尝试向实现服务的类添加一些状态信息,它只保留在命名管道的实例中。这可能与第一个问题有关,但是无论如何强制命名管道使用实现服务的类的相同实例?

  3. 最后,关于 MMF 与命名管道的任何想法?

编辑 - 关于解决方案

根据 Tomasr 的回答,解决方案在于使用正确的构造函数来提供实现服务的具体单例类(ServiceHost Constructor (Object, Uri[]))。当时我不欣赏的是他提到确保服务类是线程安全的。天真地只是更改构造函数导致服务器崩溃,这最终导致我从这篇博客条目InstanceContextMode 和 Concurrencymode中理解了 InstanceContextMode 。设置正确的上下文很好地完成了解决方案。

4

1 回答 1

2

对于 (1) 和 (2),答案很简单:您可以要求 WCF 使用您的服务的单例实例来处理所有请求。大多数情况下,您需要做的就是使用使用Object 实例而不是类型的备用 ServiceHost构造函数。

但是请注意,您将负责使您的服务类线程安全。

至于 3,这在很大程度上取决于您需要做什么、您的性能需求、您期望同时有多少客户、您将移动的数据量以及需要多长时间可用等.

于 2010-06-18T01:55:31.280 回答