C# 计划任务或服务的容错性和可靠性的最佳实践

C# 计划任务或服务的容错性和可靠性的最佳实践,c#,.net,reliability,fault-tolerance,C#,.net,Reliability,Fault Tolerance,我一直在处理许多作为windows服务或计划任务运行的应用程序 现在,我想确保这些应用程序具有容错性和可靠性。例如我有一个每小时运行的服务。如果服务在运行或运行时崩溃,我希望应用程序在同一时间段内再次运行(这涉及到一些事情,包括数据处理事务),以避免数据丢失。此外,我希望程序报告错误的细节。我的目标是避免数据丢失,并且在运行程序时不会落后 我构建了一个类库,用户可以将其导入到项目中。库应该保存程序运行实例的信息,即程序读取和写入运行间隔、运行状态等信息。这些数据存储在数据库中 我很好奇,是否有一

我一直在处理许多作为windows服务或计划任务运行的应用程序

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

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

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


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

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


此外,还应将任务安排在正常工作时间以外的时间运行——显然是在夜间。

我对其他人说的话很感兴趣,但我会告诉你我偶然发现的几点:

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

    AppDomain.CurrentDomain.UnhandledException+=新的UnhandledExceptionEventHandler(AppUnhandledExceptionEventHandler)

  • 覆盖应用程序主要部分中所需的任何servicebase事件处理程序。OnStart和OnStop非常重要,但是还有很多其他的可以使用

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

  • 如果要更新线程,请确保在关键部分使用lock()或监视器,以确保所有内容都是线程安全的

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

  • 永远不要使用UI创建服务。事实上,对于Vista和7,它们几乎不可能做到。它不需要用户交互,您最多只能使用WIN32函数发送消息。MSDN声称制作交互式服务是一种糟糕的做法

  • 出于调试的目的,让服务作为控制台应用程序运行是非常酷的,直到您让它执行您想要的操作为止。精彩教程:


  • 无论如何,希望这能有所帮助,但这只是我自己摸索的几件事。

    我说的是不同服务器上的独立任务或服务。我的目标是确保该服务将继续运行,报告任何故障并从中恢复,同时将数据丢失降至最低或零。我发现的最好的广告是FireDaemon。不知道它是怎么运行的,我现在正在检查它。但是它的广告功能非常好。谢谢,我确实看过了。我宁愿编写代码并控制它。