【问题标题】:why Windows Service crash?为什么 Windows 服务崩溃?
【发布时间】:2009-09-22 09:27:36
【问题描述】:

我正在使用 VSTS 2008 + C# + .Net 3.5 开发 Windows 服务应用程序。下面的代码很简单,我发现当 File.Copy 抛出异常时(例如路径无效,没有权限等),服务会崩溃并弹出一个对话框让我调试。我的困惑是,我认为由 Windows 服务创建的线程的未处理异常永远不会使服务崩溃。为什么我的服务崩溃并弹出调试对话框?

   public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread t = new Thread (WriteF);
            t.Start();
        }

          static void WriteF() {
              File.Copy("dummy.txt", @"\\somelocation\dummy.txt");
          }

        protected override void OnStop()
        {
        }
    }

【问题讨论】:

  • err... 因为里面有bug??
  • 虚拟数以亿计的点数。回答的动力在哪里?我还以为是别的东西。

标签: c# .net visual-studio-2008 windows-services


【解决方案1】:

我认为由 Windows 服务创建的线程的未处理异常永远不会导致服务崩溃

你的假设是完全错误的。 Windows 服务中未处理的异常将导致它崩溃。出现调试对话框是因为您的系统上配置了调试器。从 .NET 2.0 开始,任何线程上的未处理异常都会关闭整个应用程序。仅仅因为您正在使用线程并不意味着线程中的异常会神奇地消失。

【讨论】:

  • Windows服务的任何线程抛出的异常都会导致Windows服务崩溃?
  • 是的。这不是服务独有的,任何应用程序都一样。
【解决方案2】:

您的文件复制操作引发了未被捕获的异常。就那么简单。除非您将 File.Copy 操作包装在 try catch 块中,否则该服务将失败。操作是否在后台线程上执行并不重要。我还建议添加一些日志记录,否则您将无法发现失败的原因。

【讨论】:

  • 我不确定这是否相同,但我们之前从服务中创建了一个线程主线程(它运行以不阻止服务)。然后它将检索用户列表,并循环用户,为每个用户创建一个线程来执行任务。在一个线程有未处理的异常的事件中,其他线程 disd 完成。我在发什么问题,还是这与问题不同?
  • Windows服务的任何线程抛出的异常都会导致Windows服务崩溃?
【解决方案3】:

您启动一个新线程来运行 WriteF 中的代码。如果此代码因异常而失败,则运行时将尝试通过展开该特定线程的堆栈来查找异常处理程序。如果无法找到处理程序,则运行时别无选择,只能报告未处理的异常,从而终止进程。请记住,异常处理是每个线程的。这不是 Windows 服务问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多