本周我一直试图加快命名管道的速度。我试图用它们解决的任务是,我有一个现有的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 And Concurrencymode了解InstanceContextMode。设置正确的上下文很好地完成了解决方案。
答案 0 :(得分:2)
对于(1)和(2),答案很简单:您可以要求WCF使用服务的单例实例来处理所有请求。大多数情况下,您需要使用备用ServiceHost constructor来获取Object实例而不是类型。
但请注意,您将负责使您的服务类线程安全。
至于3,它在很大程度上取决于你需要做什么,你的性能需求,你期望的客户数量,你将要移动的数据量以及需要多长时间可用,等等。