代码之家  ›  专栏  ›  技术社区  ›  chezy525

C#:显示来自Windows服务的实时消息的图形用户界面

  •  6
  • chezy525  · 技术社区  · 14 年前

    我已经编写了一个C#windows服务,它可以将消息写入自定义事件日志或任意数量的文件。这些消息都用一些优先级标记(例如,只有错误和警告存储在事件日志中,但如果需要,可以将更多的错误和警告存储到文件中)。

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

    这是我第一个真正的windows服务,所以我似乎错过了一些关键字来找出如何做到这一点。。。有没有什么代码示例、教程、参考资料等来说明如何做这样的事情?

    更新
    很多有用的答案,我喜欢有很多方法可以解决问题的时候!我想我要实现一个基于WCF的自托管解决方案。我仍然很轻的细节,因为我正在努力了解世界基金会(我相信它将证明我在其他项目相当有用)。。。但到目前为止,我已经找到了 here 做一个最有用的介绍。

    7 回复  |  直到 14 年前
        1
  •  8
  •   kemiller2002    14 年前

    您可以做的是让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

    实际上,真正酷的是,您可以让多个应用程序也这样监听。所以你可以在屏幕上显示它,然后让另一个应用程序记录它等等,而这两个外部应用程序对彼此一无所知。

        2
  •  3
  •   Matt Davis    14 年前

    我知道这一点已经提到过了,但请使用Windows通信基础(WCF)。具体来说,使用 Publish-Subscribe Framework 开发单位 Juval Lowy ,作者 Programming WCF Services . 详情见 this excellent MSDN article ,并且源代码在 Lowy's website .

    这个框架的精妙之处在于,它将发布者(例如,您的Windows服务)与任何订阅者(例如,您的GUI)分离。发布者“发布”与发布/订阅服务(始终可用)相关的事件。从出版商的角度来看,有没有订户并不重要。Pub/Sub服务负责将事件路由到任何和所有注册的订阅者。这样,您的Windows服务会在事件发生时发布事件,当加载/退出时,您的GUI将订阅/取消订阅PUB/SUB服务,而PUB/子服务将在事件发生时通知您的GUI。

    我已经在我的项目中使用了这个设置,它工作得非常好。

        3
  •  2
  •   Ta01    14 年前

    alt text

    我真的用过 BitFactory Logger 具有可用于此目的的套接字记录器。

        4
  •  2
  •   KeithS    14 年前

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

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

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

        5
  •  0
  •   Eugene Mayevski 'Callback    14 年前

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

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

        6
  •  0
  •   Jake Kalstad    14 年前

    观察者模式!

    可能是所有可观察模型的委托,您可以将其与您的服务挂钩?

        7
  •  0
  •   leppie    14 年前

    IPC通道上的.NET远程处理。