我内置了C#,由两部分组成的软件:一个是执行某些操作的Windows服务,另一个是用于向服务发送命令的托盘应用程序,但从服务接收消息< / strong>并通知用户。
对于此通信,我在windows-service中创建了一个WCF服务器(NamedPipes),然后Tray-Application连接并“订阅”以接收消息。
为了让托盘应用程序接收来自服务的通知,它们之间的连接是DuplexChannel
。在DuplexChanel中,客户端调用服务器,服务器可以在客户端上执行方法。
但现在我明白DuplexChannel
并不是真的那样(我的意思是从客户端长时间聆听):默认情况下,它会在一段时间不活动后关闭,并在我设置生产模式后关闭,它在很长一段时间后关闭或者可能是睡眠模式等等。我放弃了试图解决它造成的问题(也许我错了)。
什么是正确的 - 从Windows服务向同一台PC中的客户端软件发送消息的最佳方式A.长时间(只要计算机正在运行)B。在某种程度上允许多个客户端(因为托盘应用程序多次启动,每个用户启动一次)。
答案 0 :(得分:1)
您也可以使用MSMQ。但是WCF是要走的路。不要被这个有点复杂的概念吓跑,WCF将为您解决繁重的问题。 最大的挑战是配置,但在一天结束时,WCF只是另一个沟通渠道。我建议this和此tutorial。
答案 1 :(得分:1)
IMO对WCF来说这是一个非常讨厌的事情,即使我已经多次遇到过这个问题。就个人而言,我通常更喜欢使用TCP套接字来与ProtoBuf类似的场景进行(反)序列化。对于有一些客户的简单场景,这种方法很好,但是对于很多客户来说,事情会变得非常严峻。
在复杂的场景中,您可能需要能够自动处理许多不同问题的内容,例如重新连接,轮询,池化等。此外,如果您使用WPF进行UI,则所有内容都需要发生异步而您必须在正确的线程中处理事件,这是正确的痛苦...如果你有这样的场景,我认真考虑去https://www.asp.net/signalr。
答案 2 :(得分:0)
答案 3 :(得分:0)
你应该使用WCF,它将为你处理讨厌的事情。您只需要进行配置,它只是另一个通信通道,而不是使用HTTP。go through msdn
答案 4 :(得分:0)
系统托盘应用程序(A)服务(B)都需要在每一方使用两个服务充当客户端和服务器 你可以做这样的事情。 连接到B并通过注册ip或soemthing标记其期望通知 B当需要通知它时连接到所有已注册的A app服务 当应用服务方法执行时,您可以显示通知
答案 5 :(得分:0)
在类似的情况下,有一个服务产生并控制多个子进程,来自NamedPipeClientStream/NamedPipeServerStream
的{{1}}组合对我来说非常合适。