C#:GUI,用于显示来自Windows服务的实时消息

我编写了一个C#windows服务,可以将消息写入自定义EventLog或任意数量的文件。 这些消息都标有一些优先级(因此,例如,只有ERROR和WARNING存储在EventLog中,但如果需要,可以将更多内容存储到文件中)。

我现在要做的是创建一个GUI,可以监听这些消息并实时显示它们。 允许用户观看当前消息(无论其所需的优先级),而无需将所有内容存储到文件中。 我假设这是一个单独的程序,在服务中有某种forms的钩子,但我不确定从哪里开始。

这是我的第一个真正的Windows服务,所以我似乎缺少一些关键字,以了解如何做到这一点…是否有任何代码示例,教程,参考,如何做这样的事情?

UPDATE
很多有用的答案,我喜欢它,有很多方法可以解决问题! 我想我将实现一个基于WCF的自托管解决方案。 我仍然非常关注细节,因为我正在尝试了解WCF(我相信它对我在其他项目中非常有用)…但到目前为止,我发现这里的video是最多的有用的介绍方法。

你可以做的是让windows服务有办法注册一个事件(你可以通过使用Windows Communication Foundation来实现)。 当您的错误出现时,它会触发该事件,并会通知您的winforms应用程序。 它被称为双工合同:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/0eb69998-0388-4731-913e-fb205528d374/

http://msdn.microsoft.com/en-us/library/ms731184.aspx

实际上,真正酷的是你可以通过这种方式监听多个应用程序。 因此,您可以在屏幕上显示它,并让其他应用程序记录它等,而不需要两个外部应用程序了解彼此。

我知道这已经提到了,但是使用Windows Communication Foundation(WCF)。 具体来说,使用由编程WCF服务的作者Juval Lowy开发的Publish-Subscribe Framework 。 详细信息在这篇优秀的MSDN文章中有描述,源代码可在Lowy的网站上免费获得。

这个框架的巧妙之处在于它将发布者(例如,您的Windows服务)与任何订阅者(例如您的GUI)分离。 发布者“发布”Pub / Sub服务感兴趣的事件,该事件始终可用。 从发布者的角度来看,是否有任何订阅者并不重要。 发布/订阅服务负责将事件路由到任何和所有注册订阅者。 通过这种方式,您的Windows服务会在事件发生时发布,您的GUI将在加载/退出时订阅/取消订阅发布/订阅服务,并且发布/订阅服务将在事件发生时通知您的GUI。

我在我的项目中使用了这个设置,它运行得非常好。

替代文字

我实际上使用了BitFactory Logger ,它有一个可用于此目的的套接字记录器。

你所描述的是进程间通信,它可能会变得混乱。

最简单,最优雅,但可能是最不活跃的,是将服务写入条目作为小文本文件(或附加到日志),并让您的GUI使用FileSystemWatcher来检测新文件或更新日志文件,并读取文件。 您必须确保该服务打开文件以“共享”方式附加,允许在写入时进行只读访问。 否则,您将阻止一个进程或另一个进程,可能导致丢失的消息。

进程可以通过一些内置管道进行通信。 如果您的服务将消息写入其StandardOutput管道,则GUI可以远程附加侦听器并在写入消息时接收事件。 这可能是最优雅的非文件方式来做你想要的。 研究Process类,尤其是OutputDataReceived事件。 您必须使用GetProcess()通过一些唯一标识信息从GUI查找过程。

您需要寻找“同步”和“进程间通信”。 在您的情况下,服务将使用全局事件或信号量来指示数据的存在,GUI进程将检查事件/信号量状态并从事件日志或文件中读取更新。

存在更复杂的场景,但上述是一个很好的起点。

观察者模式!

也许是您可以与服务挂钩的所有可观察模型的代表?

通过IPC通道进行.NET远程处理。