.NET Windows服务突然停止

时间:2009-11-11 14:56:04

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

HI Guys, 我已经创建了一个生成三个线程的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。

我查看了网络并说出了无效的操作异常。

你们是否认为停止服务是否必须对线程做任何事情。 而另一个愚蠢的问题是我每次都会产生3个新线程,或者相同的线程会在15秒或1分钟内产生。

4 个答案:

答案 0 :(得分:2)

可能你的一个主题是抛出未处理的异常。这会让你的过程立即死亡。通过将线程中的代码包装到try-catch-blocks中,确保在某个时刻处理线程内的任何异常(并且不要忘记正确记录以便您可以了解出错的地方)。 / p>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

翘,

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

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