13

我一直在研究许多作为 Windows 服务或计划任务运行的应用程序。

现在,我想确保这些应用程序具有容错性和可靠性。例如; 我有一个每小时运行的服务。如果服务在运行或运行时崩溃,我希望应用程序在同一时期再次运行(这涉及到一些事情,包括数据处理的事务),以避免数据丢失。此外,我喜欢程序以详细报告错误。我的目标是避免数据丢失并且不落后于运行程序。

我已经构建了一个用户可以导入到项目中的类库。库应该保存程序运行实例的信息,即。程序读取和写入运行间隔、运行状态等信息。这些数据存储在数据库中。

我很好奇,是否有一些最佳实践可以使计划任务/ Windows 服务具有容错性和可靠性。

编辑:我说的是不同服务器上的独立任务或服务。我的目标是确保服务继续运行,报告任何故障并从中恢复。

4

2 回答 2

8

我对其他人不得不说的话很感兴趣,但我会给你一些我偶然发现的观点:

  1. 为未处理的异常创建事件处理程序。通过这种方式,您可以清理资源、写入日志文件、向管理员发送电子邮件或任何您需要的东西,而不是让它崩溃。

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppUnhandledExceptionEventHandler);

  2. 在应用程序的主要部分覆盖您需要的任何 servicebase 事件处理程序。OnStart 和 OnStop 非常重要,但您还可以使用许多其他方法。http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. 当心计时器。Windows 窗体计时器无法在服务中正常工作。用户 System.Threading.Timers 或 System.Timers.Timer。在 Windows 服务中使用的最佳计时器

  4. 如果您在线程上更新,请确保在关键部分使用 lock() 或监视器以确保一切都是线程安全的。

  5. 注意不要使用任何用户特定的东西,因为服务在没有特定用户上下文的情况下运行。我注意到我的一些 SQL 连接字符串不再适用于 Windows 授权等。还听说有人在映射驱动器方面遇到问题。

  6. 永远不要使用 UI 来提供服务。事实上,对于 Vista 和 7,它们几乎不可能做到。它不应该需要用户交互,你最多可以做的是发送带有 WIN32 功能的消息。MSDN 声称制作交互式服务是不好的做法。http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. 出于调试目的,让服务作为控制台应用程序运行非常酷,直到你让它做你想做的事情。很棒的教程: http: //mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

无论如何,希望这会有所帮助,但这只是我自己寻找的几件事。

于 2010-05-27T18:37:09.360 回答
0

显而易见的事情 - 不要同时运行所有任务。尝试安排它们,以便在任何时候(如果可能)只有一项任务使用一些昂贵的资源。例如,如果您需要发送时事通讯和一些特定通知,请将它们安排在不同的时间。如果两个任务需要清理数据库中的某些内容,让一个接一个运行。

还要安排在正常工作时间之外运行的任务——显然是在晚上。

于 2010-05-27T16:29:15.840 回答