从Windows服务接收通知

时间:2017-09-28 17:51:41

标签: c# wcf windows-services ipc

我内置了C#,由两部分组成的软件:一个是执行某些操作的Windows服务,另一个是用于向服务发送命令的托盘应用程序,但从服务接收消息< / strong>并通知用户。

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

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

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

问题:

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

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在类似的情况下,有一个服务产生并控制多个子进程,来自NamedPipeClientStream/NamedPipeServerStream的{​​{1}}组合对我来说非常合适。