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