代码之家  ›  专栏  ›  技术社区  ›  alice7

.NET Windows服务突然停止

  •  0
  • alice7  · 技术社区  · 15 年前

    嗨,伙计们, 我创建了一个生成三个线程的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错误报告EventID:5000。

    我浏览了一下网络,上面写着无效的operationexception。

    你们认为停止服务是否和线程有关? 另一个愚蠢的问题是,每次我都会产生3个新的线程,或者同样的线程每隔15秒或1分钟出现一次。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Dirk Vollmar    15 年前

    可能你的一条线在 未处理的异常 .这会让你的过程立即死亡。确保在某个时刻通过将线程中的代码包装到try catch块中来处理线程中的任何异常(不要忘记正确记录,这样您就可以知道出错的地方)。

        2
  •  0
  •   Shiraz Bhaiji    15 年前

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

        3
  •  0
  •   Adrian Zanescu    15 年前

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

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

        4
  •  0
  •   Plip    15 年前

    爱丽丝,

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

    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