这周我一直在努力跟上命名管道的速度。我试图与他们一起解决的任务是我有一个现有的 Windows 服务,它充当设备驱动程序,将数据从外部设备汇集到数据库中。现在我必须修改这个服务并添加一个可选的用户前端(在同一台机器上,使用一种 IPC 形式),它可以监控设备和数据库之间传递的数据,并将一些命令发送回服务.
我对 IPC 的最初想法是命名管道或内存映射文件。到目前为止,我一直在使用WCF Tutorial Basic Interprocess Communication解决命名管道的想法。我的想法是使用实现 WCF NamedPipe 服务的附加线程设置 Windows 服务,并将其用作驱动程序内部的管道。
我的示例代码可以正常工作,但是我无法解决 2 个问题,我希望这里的人可以帮助我:
在本教程中,ServiceHost 使用 typeof(StringReverser) 实例化,而不是通过引用具体类。因此,似乎没有服务器与服务本身交互的机制(在 host.Open() 和 host.Close() 行之间)。是否可以在服务器和实际实现服务的类之间创建链接并传递信息?如果是这样,怎么做?
如果我运行服务器的单个实例,然后运行客户端的多个实例,似乎每个客户端都获得了服务类的单独实例。我尝试向实现服务的类添加一些状态信息,它只保留在命名管道的实例中。这可能与第一个问题有关,但是无论如何强制命名管道使用实现服务的类的相同实例?
最后,关于 MMF 与命名管道的任何想法?
编辑 - 关于解决方案
根据 Tomasr 的回答,解决方案在于使用正确的构造函数来提供实现服务的具体单例类(ServiceHost Constructor (Object, Uri[]))。当时我不欣赏的是他提到确保服务类是线程安全的。天真地只是更改构造函数导致服务器崩溃,这最终导致我从这篇博客条目InstanceContextMode 和 Concurrencymode中理解了 InstanceContextMode 。设置正确的上下文很好地完成了解决方案。