【问题标题】:Reasons for windows service to stopwindows服务停止的原因
【发布时间】:2009-10-19 22:45:04
【问题描述】:

我用 C# 设计了一个 Windows 服务,它可以连续运行并产生三个线程。 第一个线程每 15 秒运行一次。第二个线程每分钟运行一次。 而且 thirs 只运行一次。

我的问题是,这个 Windows 服务在几天后不知何故停止了。停止当天的事件日志中没有记录任何内容。并且它没有在日志文件中写入任何内容。

我想知道 Windows 服务突然停止的各种原因。 而且这个服务不在我的 DEV box 上,它在 QA server 上。

希望它有意义!

【问题讨论】:

    标签: c# windows windows-services


    【解决方案1】:

    您的一个线程上可能有一个未处理的异常——从 .NET 2.0 开始,未处理的异常会像这样突然中断进程。确保您在线程上运行的任何内容的堆栈顶部都有一个 catch 块来处理错误(日志、吞咽、编组到另一个线程等等)。您可以通过将以下内容添加到服务的 .exe.config 文件中来暂时阻止这种行为(例如,恢复到 .NET 2.0 之前的行为):

    <configuration>
      <runtime>
        <legacyUnhandledExceptionPolicy enabled="1" />
      </runtime>
    </configuration>
    

    但不要依赖它——它可能会在未来的 .NET 版本中被删除(尚未检查 4.0——它可能已经消失了)。

    【讨论】:

    • 这是正确的。每个线程必须有一个 try/catch 块来捕获任何Exception 并优雅地处理故障(如果没有其他适用的情况,记录到事件日志是一个很好的解决方案)。否则,任何线程中未处理的异常都会杀死你的整个服务。
    • 如果您不使用故障停止日志记录(即,日志到事件日志可以抛出权限)确保您的错误处理代码也有一个 try/catch,否则日志失败可能会导致进程停止也是。
    • @Daniel Pryden:AppDomain.UnhandledException 处理程序不会捕获线程中的异常吗?或者这不是一个可靠的方法?
    • AppDomain.UnhandledException 只是一个通知。它不像 1.1 那样提供支持。
    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2022-12-22
    • 2022-01-19
    • 2015-01-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多