WCF命名管道IPC

Pet*_*r M 6 wcf named-pipes netnamedpipebinding

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

我对IPC的初步想法是命名管道或内存映射文件.到目前为止,我一直在使用WCF教程基本进程间通信来完成命名管道的想法.我的想法是使用一个实现WCF NamedPipe服务的附加线程来设置Windows服务,并将其用作我的驱动程序内部的管道.

我有示例代码工作,但是我无法理解2个问题,我希望有人可以帮助我:

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

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

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

编辑 - 关于解决方案

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

tom*_*asr 2

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

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

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