繁体   English   中英

从Windows服务接收通知

[英]receive notification from windows-service

我内置了C#,由两部分组成的软件:一个是Windows服务,它做了一些事情,另一个是Tray-Application,用于向服务发送命令,但也从服务接收消息并通知用户。

对于这种通信,我在windows-service中创建了一个WCF服务器(NamedPipes),然后Tray-Application连接并“订阅”以接收消息。

为了让托盘应用程序从服务接收通知,它们之间的连接是DuplexChannel 在DuplexChanel中,客户端调用服务器,服务器可以在客户端上执行方法。

但现在我明白DuplexChannel并不是真的那样(我的意思是从客户端长时间收听):默认情况下,它会在一段时间不活动后关闭,在我设置生产模式后,它会在很长一段时间后关闭或者可能是睡眠模式等等。 我放弃了试图解决它创造的问题(也许我错了)。

问题:

什么是正确的 - 从Windows服务向同一台PC中的客户端软件发送消息的最佳方式A.长时间(只要计算机正在运行)B。以允许多个方式的方式客户端(因为托盘应用程序多次启动,每个用户启动一次)。

您也可以使用MSMQ 但是WCF是要走的路。 不要被这个有点复杂的概念吓跑,WCF将为您解决繁重的问题。 最大的挑战是配置,但在一天结束时,WCF只是另一个沟通渠道。 我推荐这个和本教程

即使我多次遇到过这个问题,IMO对WCF来说这是一个非常讨厌的事情。 就个人而言,我通常更喜欢使用TCP套接字与ProtoBuf类似的场景进行(反)序列化。 对于有少数客户的简单场景,这样做会很好,但是对于很多客户来说,事情会变得相当严峻。

https://csharphardcoreprogramming.wordpress.com/2014/01/31/protocol-buffers-part-3-advanced-tcp-networking/有一个很好的例子。

在复杂的场景中,你可能想要一些可以自动处理许多不同问题的东西,比如重新连接,轮询,池化等。另外,如果你使用WPF作为UI,一切都需要发生异步,你必须处理正确的事件线程,这是一个正确的痛苦......如果你有这样的场景,我会认真考虑去https://www.asp.net/signalr

  1. 我认为使用WCF可以开发Websocket服务
  2. 你也可以使用轮询技术,客户经常要求(呼叫)服务器获取任何新闻(轮询)。长轮询和短轮询可能是有用的
  3. 在客户端的服务器和tcp客户端上开发tcp lisenter

你应该使用WCF,它将为你处理讨厌的事情。 您只需要进行配置,它只是另一个通信通道,而不是使用HTTP。 通过msdn

系统托盘应用程序(A)服务(B)都需要充当客户端和服务器,在每一方使用两个服务,你可以做这样的事情。 连接到B并通过在需要通知它时注册ip或类似B的东西来标记其预期通知连接到所有已注册的A应用服务当应用服务方法执行时您可以显示通知

在类似的情况下,有一个服务产生并控制多个子进程, System.IO.PipesNamedPipeClientStream/NamedPipeServerStream的组合对我来说非常适合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM