C# 将服务执行封闭在try-catch中:糟糕的做法?
下面是windows服务程序的常用Program.cs内容:C# 将服务执行封闭在try-catch中:糟糕的做法?,c#,windows-services,try-catch,C#,Windows Services,Try Catch,下面是windows服务程序的常用Program.cs内容: static class Program { /// <summary> /// The main entry point for the application. /// </summary> static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new Ser
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
}
}
静态类程序
{
///
///应用程序的主要入口点。
///
静态void Main()
{
ServiceBase[]ServicesToRun;
ServicesToRun=新的ServiceBase[]
{
新MyService()
};
ServiceBase.Run(ServicesToRun);
}
}
将ServiceBase.Run(…)
封装在try-catch块中是一种不好的做法吗
谢谢
编辑: 执行了一些测试并发现(测试方法:向服务发送自定义命令,该服务在OnCustomCommand覆盖中引发ApplicationException): A.在try/catch中封装ServiceBase.Run()不会捕获OnCustomCommand中引发的异常,因为当服务线程开始执行时,try块已在作用域中。因此,质疑这种方法的核心是无关紧要的,只要它不能满足它的目的 B.为AppDomain.CurrentDomain.UnhandledException添加处理程序也未捕获异常
但是,在这两种情况下,异常都显示在Windows事件日志中。这很好地解决了我需要知道在服务执行过程中什么时候崩溃的问题,但问题仍然存在:是否存在这样的情况:服务可能会在事件日志中没有任何跟踪的情况下悄无声息地崩溃?这取决于您正在做什么。如果您打算处理异常并对它们做一些有用的事情(例如重试、运行备份、通知用户并要求反馈等),那么我认为这不是一个坏做法
正如我所说,这取决于你在做什么。该服务的主要方法中充满了try-catch,但即便如此,该服务似乎还是意外地关闭了(我说“似乎”,因为我真的不知道它是否崩溃或被某人手动停止;它运行在一个不同的、相当隔离的环境中)。我想在ServiceBase.Run()周围添加try-catch块,只是为了能够区分停止/崩溃,但我不确定这是否是长期运行进程的有效设置。该设置看起来确实很脆弱。您必须检查特定的异常,以了解服务何时停止以及何时崩溃,但您还将捕获其他异常。如果您的服务位于远程计算机上,并且网络崩溃,那么您将拥有一个既没有停止也没有崩溃的服务。将日志信息添加到您的服务的OnStop、OnShutdown等方法中,并让它记录所发生的事情;也许,如果你发现服务到底发生了什么,你会对事情有一个新的看法,并从那里开始。