从Windows服务接收通知

4
我用C#编写了一款由两部分组成的软件:一部分是Windows服务,它执行某些操作;另一部分是托盘应用程序,可以向服务发送命令,同时也能够接收来自服务的消息并通知用户
为了实现这种通信,我在Windows服务中创建了一个WCF服务器(NamedPipes),然后托盘应用程序连接并“订阅”以接收消息。
为了使托盘应用程序接收服务的通知,它们之间的连接采用了DuplexChannel。在DuplexChanel中,客户端调用服务器,服务器可以在客户端上执行方法。
但是现在我明白了DuplexChannel并不适合这种长时间监听(即从客户端处):默认情况下,在一段时间内没有活动后,它会关闭,并且在我设置生产模式之后,它会在很长时间或者睡眠模式后关闭。我放弃了试图解决它所带来的问题(也许我错了)。
问题是:如何正确 - 最佳地将消息从Windows服务发送到同一台PC上的客户端软件?A. 长时间运行(只要计算机正在运行)B. 以允许多个客户端的方式(因为托盘应用程序会多次启动,每个用户只启动一次)。

你看过SignalR吗?https://code.msdn.microsoft.com/windowsapps/SignalR-self-hosted-in-6ff7e6c3 - Pete
这取决于你问谁。微软现在正在推动WCF作为上述场景中进程间通信的标准。然而,还有许多其他可能性,如Post/Send Windows消息、命名管道、套接字、内存映射文件等等。您能否缩小一下您遇到的空闲问题?定期的“脉冲”是否可以用来“保持”您的连接? - Ross Bush
6个回答

1

在使用WCF时,我认为这是一件非常恶心的事情,尽管我已经多次遇到这个问题。就我个人而言,我通常更喜欢使用TCP套接字以及ProtoBuf进行(反)序列化来处理类似的场景。对于简单的场景和少量客户端,这样做是可以正常工作的,但是对于大量客户端,情况会变得相当糟糕。

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

在复杂的场景中,您可能需要自动处理许多不同的问题,例如重新连接、轮询、池等等。此外,如果您在UI中使用WPF,则所有操作都需要异步进行,并且您必须在正确的线程中处理事件,这很烦人... 如果您有这样的场景,我会认真考虑使用 https://www.asp.net/signalr


1
你也可以使用 MSMQ。但WCF才是正确的选择。不要被有些复杂的概念吓到,WCF会为你处理繁重的工作。最大的挑战在于配置,但归根结底,WCF只是另一种通信渠道。我建议使用这个这个教程

1
我认为使用WCF可以开发Websocket服务。此外,您还可以使用轮询技术,在其中客户端经常向服务器请求(调用)任何新闻(轮询)。长轮询和短轮询都可能有用。在服务器上开发tcp监听器和在客户端上开发tcp客户端。

0

系统托盘应用程序(A)和服务(B)都需要使用每个侧面的两个服务作为客户端和服务器进行操作,您可以像这样做。 A连接到B并通过注册IP或类似方式标记其期望收到通知 当B需要通知时,它会连接到所有已注册的A应用程序服务 当A应用程序服务方法执行时,您可以显示通知


0
在一个类似的场景中,当有一个服务生成和控制多个子进程时,System.IO.Pipes 中的 NamedPipeClientStream/NamedPipeServerStream 的组合对我来说非常完美。

0

你应该使用 WCF,它会为你处理掉不好的部分。你只需要进行配置,这只是另一种通信渠道,而不是使用HTTP。查看MSDN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接