[英]receive notification from windows-service
我内置了C#,由两部分组成的软件:一个是Windows服务,它做了一些事情,另一个是Tray-Application,用于向服务发送命令,但也从服务接收消息并通知用户。
对于这种通信,我在windows-service中创建了一个WCF服务器(NamedPipes),然后Tray-Application连接并“订阅”以接收消息。
为了让托盘应用程序从服务接收通知,它们之间的连接是DuplexChannel
。 在DuplexChanel中,客户端调用服务器,服务器可以在客户端上执行方法。
但现在我明白DuplexChannel
并不是真的那样(我的意思是从客户端长时间收听):默认情况下,它会在一段时间不活动后关闭,在我设置生产模式后,它会在很长一段时间后关闭或者可能是睡眠模式等等。 我放弃了试图解决它创造的问题(也许我错了)。
什么是正确的 - 从Windows服务向同一台PC中的客户端软件发送消息的最佳方式A.长时间(只要计算机正在运行)B。以允许多个方式的方式客户端(因为托盘应用程序多次启动,每个用户启动一次)。
即使我多次遇到过这个问题,IMO对WCF来说这是一个非常讨厌的事情。 就个人而言,我通常更喜欢使用TCP套接字与ProtoBuf类似的场景进行(反)序列化。 对于有少数客户的简单场景,这样做会很好,但是对于很多客户来说,事情会变得相当严峻。
在复杂的场景中,你可能想要一些可以自动处理许多不同问题的东西,比如重新连接,轮询,池化等。另外,如果你使用WPF作为UI,一切都需要发生异步,你必须处理正确的事件线程,这是一个正确的痛苦......如果你有这样的场景,我会认真考虑去https://www.asp.net/signalr 。
你应该使用WCF,它将为你处理讨厌的事情。 您只需要进行配置,它只是另一个通信通道,而不是使用HTTP。 通过msdn
系统托盘应用程序(A)服务(B)都需要充当客户端和服务器,在每一方使用两个服务,你可以做这样的事情。 连接到B并通过在需要通知它时注册ip或类似B的东西来标记其预期通知连接到所有已注册的A应用服务当应用服务方法执行时您可以显示通知
在类似的情况下,有一个服务产生并控制多个子进程, System.IO.Pipes
的NamedPipeClientStream/NamedPipeServerStream
的组合对我来说非常适合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.