【问题标题】:.NET windows service getting stopped abruptly.NET Windows 服务突然停止
【发布时间】:2009-11-11 14:56:04
【问题描述】:

大家好, 我创建了一个产生三个线程的 Windows 服务。第一个线程每 15 秒唤醒一次,第二个线程每分钟唤醒一次。第三个线程一天一次。 我的代码如下所示:

        var timer1 = new Timer();
        timer1.Elapsed += ProcessTimerEvent1;
        timer1.Interval = 60000;
        timer1.Start();

        var timer2 = new Timer();
        timer2.Elapsed += ProcessTimerEvent2;
        timer2.Interval = 15000;
        timer2.Start();

        var timer3 = new Timer();
        timer3.Elapsed += ProcessTimerEvent3;
        timer3.Interval = 86400000;
        timer3.Start();

从我的事件日志中,我可以看到它说的是 .NET Runtime 2.0 Error Reporting EVENTID:5000。

我浏览了网络,它说无效操作异常。

你们认为这种服务停止是否与线程有关。 另一个愚蠢的问题是我是每次都产生 3 个新线程,还是相同的线程每 15 秒或 1 分钟就启动。

【问题讨论】:

    标签: c# asp.net windows exception windows-services


    【解决方案1】:

    您的某个线程可能正在引发未处理的异常。这将使您的进程立即终止。通过将线程内的代码包装到 try-catch-blocks 中,确保在某个时候处理线程内的任何异常(并且不要忘记正确记录,以便您可以知道出错的事情)。

    【讨论】:

      【解决方案2】:

      这可能是由于您的某个事件中的代码出现异常。

      【讨论】:

        【解决方案3】:

        您是否在某个全局(静态)对象上保留了计时器的引用?如果不是,即使它们仍在运行,它们也是垃圾收集的候选者。 CG 将调用它们的析构函数,而女巫又会调用 Dispose 方法,并且您的线程将突然停止。

        对于秒问题;计时器使用线程池来产生线程。每个处理都会从池中获取一个线程,使用它,然后释放它。在周期之间,他们只是等待来自系统时钟的通知。

        【讨论】:

          【解决方案4】:

          爱丽丝,

          您可以使用如下代码向您的服务添加未处理的异常处理:-

          namespace YourNamespace
          {
              static class Program
              {
          
                  [STAThread]
                  static void Main()
                  {
                      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                      Application.EnableVisualStyles();
                      Application.SetCompatibleTextRenderingDefault(false);
                      Application.Run(new Form1());
                  }
          
                  static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
                  {
                      HandleException(e.Exception);
                  }
          
                  static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
                  {
                      HandleException((Exception)e.ExceptionObject);
                  }
          
                  static void HandleException(Exception e)
                  {
                      //Handle/Log Exception Here
                  }
          
              }
          }
          

          谢谢,

          菲尔

          http://exceptioneer.com

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多