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

标签 c# .net reliability fault-tolerance

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

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

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

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

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

最佳答案

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

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

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

  2. 覆盖应用程序主要部分所需的任何服务基础事件处理程序。 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。 Best Timer for using in a Windows service

  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

无论如何,希望能有所帮助,但这只是我自己四处寻找的一些东西。

关于c# - 计划任务或服务的容错和可靠性最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922559/

相关文章:

c# - Linq检查数据表中是否存在数据行

C# 打开一个窗体并关闭它

java - 不需要操作系统的.NET CLR?

c++ - 可靠的 UDP 算法?

c# - Unity MVC3 Controller 构造函数问题

c# - 在 c# 应用程序中图案化 3d 模型的最佳解决方案

.net - 通用字典并为多部分键生成哈希码

c# - 如何更新到 .NETStandard 2.0 NuGet 包

unit-testing - 使用敏捷构建生命关键系统

r - 使用循环在 r 中创建包含 ICC 结果的表