Windows 服务的实时进度
Posted
技术标签:
【中文标题】Windows 服务的实时进度【英文标题】:Realtime progress from Windows service 【发布时间】:2011-03-24 18:43:28 【问题描述】:我正在开发一个我认为更适合作为 Windows 服务的应用程序。我在计划转换它时遇到的唯一问题是它有一个显示活动的窗口。现在我知道从服务中显示 GUI 是不好的做法(并且在 Win7 中已弃用)所以我的问题是,显示进度的最佳方式是什么?
我的第一个想法是使用 RPC 和 MIDL 的轮询方法,但是操作可以在一两秒内开始和完成,使用轮询会非常不准确。
对此我还有哪些其他选择?
谢谢, J
编辑:我的问题更多是关于通信方法,我计划将其拆分为服务和任务托盘图标,但我想显示一个带有进度条的窗口,以显示服务中运行的任务的进度,但轮询会太慢了,除非它是亚秒级,这似乎很浪费,有没有办法将进度推送到任务托盘应用程序?
【问题讨论】:
【参考方案1】:创建一个完成工作的服务,以及一个可选 GUI 应用程序,如果该应用程序正在运行,它会位于系统托盘中,并允许您打开一个窗口来查看进度。您可以通过例如沟通进度共享内存或命名管道 - 但请记住,服务在没有人登录时正在运行,因此它不应该依赖于能够显示进度。
推送机制:
共享内存、互斥锁和事件 (CreateEvent)。每当服务更新状态时使用 PulseEvent 调用,让系统托盘应用程序等待事件(例如 MsgWaitForMultipleObjects) 命名管道 (CreateNamedPipe) - 这些管道也可等待系统托盘应用 TCP/UDP - 避免这种情况,您只会遇到不理解 localhost 概念的过分急切的防火墙【讨论】:
您的独立监控程序也可以使用windows服务控制管理器来显示状态或允许启动/停止服务,除了显示进度和其他位。很好地坐在带有工具提示的系统托盘中。 感谢您的建议,我已将我的问题编辑得更具体一些,因为我更想找出最佳沟通方法来显示运行任务的准确进度。谢谢,J 不要使用PulseEvent,它不可靠。 @Aaron:以一种非常明确的方式不可靠 - 这非常适合快速更新,您不在乎错过一些内容 @Erik 为什么不使用自动重置事件?【参考方案2】:在系统托盘中创建一个图标。当您的服务执行其操作时,将图标更改为动画,并更改图标的工具提示(当用户悬停鼠标时)以在气球文本中显示进度完成。
编辑:再想一想,我可能不会为图标设置动画。只是给它一个不同的外观。把它变成红色,或者别的什么。
【讨论】:
+1 这就是我们对其中一项服务所做的,它很管用。以上是关于Windows 服务的实时进度的主要内容,如果未能解决你的问题,请参考以下文章
基于Flume做FTP文件实时同步到本地磁盘的windows服务。