我要求必须始终运行在用户空间(而非服务)中运行的Windows Forms C#.NET 2.0程序。由于我不是万无一失并且犯了编码错误,我想知道我可以使用哪些额外的保护措施来确保满足这一要求。我一直在考虑的事情是TaskScheduler每5分钟检查一次,一个存根观察者或一个二级进程。这些好/坏的想法?
谢谢, 理查德
编辑:我没有使用服务的原因(明显而明智的答案!)是程序在自助服务终端类型环境中运行,并且具有繁重的GUI组件。服务选项在Windows 2000 - W7中无效。 编辑:不使用服务的第二个原因是应用需要互联网访问,在我们的一些客户站点上,代理设置为仅允许特定用户(而不是本地系统帐户),因此确保它是棘手的多个用户登录计算机时访问。答案 0 :(得分:5)
任务调度程序是一个廉价的解决方案,它确实有效。我使用它来保持我们的Perforce Proxy服务器运行(服务有一些问题),到目前为止没有问题 - 尽管现在我已经说服务器可能爆炸了!
但是,最完整的解决方案是调用您的应用程序的Windows服务。您可以从应用程序中获取该服务捕获错误返回代码,在失败时重新启动它并通过电子邮件通知您,这可以帮助您诊断和修复这些问题。我认为Task Scheduler做了类似的事情,但是它无法像定制服务那样提供对应用程序的深入了解。
如果你不确定如何做到这一点,那么这样的事情应该有效: http://www.codeproject.com/KB/install/csharpsvclesson1.aspx
答案 1 :(得分:4)
您可以采取三种方法:
心跳消息。
心跳在分布式应用程序中很有用,它只是发送的消息(从客户端发送到服务器)以确认它仍然正常/正在运行。
经理流程
存根程序,实现为用户进程或服务。它启动主应用程序,监视任何未处理的异常,报告错误并在失败时重新启动。
入口点的异常保护。
应用程序入口点中的try-catch-all。
我会推荐前两个选项中的任何一个;第三种选择,try-catch-all,对于懒惰和缺乏经验的程序员(恕我直言)来说是一个特别讨厌的黑客。
我已在大型分布式应用程序中成功使用了心跳和管理器进程。
<强>更新强>
对于ready-to-go™重启管理器,请参阅Emmanuel Istace博客文章(http://istacee.wordpress.com/2013/09/21/automatic-recovery-restart-in-net-application/)中讨论的Windows API Codepack。
安装该软件包