始终运行的 Windows 程序
Posted
技术标签:
【中文标题】始终运行的 Windows 程序【英文标题】:Windows program that always runs 【发布时间】:2011-06-24 08:58:48 【问题描述】:我要求在用户空间(不是服务)中运行的 Windows Forms C# .NET 2.0 程序必须始终运行。由于我并非万无一失并且会犯编码错误,因此我想知道我可以使用哪些额外的保护措施来确保满足此要求。我一直在考虑的事情是 TaskScheduler 每 5 分钟检查一次,一个 stub watcher 或一个辅助进程。这些是好主意还是坏主意?
谢谢, 理查德
编辑:我没有使用服务的原因(显而易见且明智的答案!)是该程序在信息亭类型的环境中运行并且具有繁重的 GUI 组件。该服务选项在 Windows 2000 - W7 上运行不佳。
编辑:不使用服务的第二个原因是应用程序需要互联网访问,并且在我们的一些客户网站上,代理设置为仅允许特定用户(不是本地系统帐户),因此很难确保如果多个用户登录机器,则访问。
【问题讨论】:
您似乎在说我如何创建像 Windows 服务但不是 Windows 服务的东西。您能解释一下为什么您不想要 Windows 服务,以便我们更好地了解您想要实现的目标吗? Windows 服务出了什么问题?它们旨在完全满足您的需求。 没错,如果你需要一些用于windows服务的gui组件,那么创建一个,用户可以选择打开它并调整设置和东西 Richard,您还可以拥有一个应用程序监控工具,每隔几分钟验证您的应用程序是否启动并运行,例如 Nagios。 @Ben 它不是服务的唯一原因是它有一个沉重的 gui(它部署在信息亭类型的情况下)。所需的平台是 Windows 2000 到 W7,并且服务呈现 GUI 的方式发生了变化,导致其执行不一致。 【参考方案1】:任务调度程序是一个便宜的解决方案,它确实有效。我用它来保持我们的 Perforce 代理服务器运行(服务有一些问题),到目前为止没有任何问题 - 虽然现在我已经说过服务器可能已经爆炸了!
不过,最完整的解决方案是调用您的应用的 Windows 服务。您可以使该服务从应用程序捕获错误返回代码,在失败时重新启动它并通过电子邮件通知您,这可能有助于您诊断和解决这些问题。我认为 Task Scheduler 做了类似的事情,但它无法像自定义服务那样深入了解您的应用程序。
如果您不确定如何执行此操作,那么应该可以使用以下方法: http://www.codeproject.com/KB/install/csharpsvclesson1.aspx
【讨论】:
服务理念是我考虑过的,但是权限变得有点棘手。默认情况下,作为本地系统帐户运行的服务无法启动作为代理设置所需的用户运行的应用程序。 确实如此,尽管您应该能够将服务设置为以用户身份运行,因此它应该能够以该用户身份启动应用程序(甚至是 GUI 应用程序)。我在作为构建用户运行的 CC.NET 服务中看到了这一点。 当然,但是当其他用户登录时会出现问题 - 要通过代理访问互联网,应用程序需要以登录用户身份运行。如果一项服务被配置为作为一个用户运行,这将变得很棘手。 啊,那么 GUI 可能在不同的用户帐户下运行吗?是的,这确实变得更加棘手。任务计划程序在那里做得更好,因为您可以为每个用户添加一个登录脚本,以确保配置了计划任务。如果丹尼斯的回答能完成这项工作,那就太好了。 没错,它将在不同的帐户下运行。任务调度器绝对是我会尝试的东西,非常感谢您的回答。【参考方案2】:您可以采取三种方法:
心跳消息。
心跳在分布式应用程序中很有用,它只是发送(从客户端到服务器)以确认它仍然健康/运行的消息。
经理流程
存根程序,实现为用户进程或服务。它启动主应用程序、监控任何未处理的异常、报告错误并在失败时重新启动。
入口点的异常保护。
应用程序入口点中的 try-catch-all。
我会推荐前两个选项中的任何一个;第三个选项,try-catch-all,对于懒惰和缺乏经验的程序员 (恕我直言) 来说是一种特别讨厌的 hack。
我已经在一个大型分布式应用程序中成功使用了心跳和管理器进程。
更新
关于 ready-to-go™ 重启管理器,请查看 Emmanuel Istace 博客文章 (http://istacee.wordpress.com/2013/09/21/automatic-recovery-restart-in-net-application/) 中讨论的 Windows API 代码包。
你可以从https://www.nuget.org/packages/WindowsAPICodePack-Core/安装包
【讨论】:
非常感谢您的回答 - 很高兴听到一些真实世界的经验。 不客气,理查德。我刚刚阅读了您更新的问题,并有更多关于信息亭的建议/经验。我肯定会推荐作为用户进程实现的管理器方法,因为当您需要部署到客户端站点时,它会给您带来更少的困难。此外(这只是一个想法)您可能希望每天早上在开放时间之前安排一个新的应用程序启动(假设它是供公众使用的),因为这样可以保证它从前一天没有进入某个已知状态并且应用程序不会跛行。 @Petah。请参阅更新的答案。如果您需要更多帮助,请告诉我。我很想知道这是否适合您;我只是快速研究了一下,想知道它是否有用。以上是关于始终运行的 Windows 程序的主要内容,如果未能解决你的问题,请参考以下文章