C# 捕获未处理的异常Windows服务

C# 捕获未处理的异常Windows服务,c#,windows,exception,service,C#,Windows,Exception,Service,我编写了一个窗口服务,如下所示: public partial class Service1 : ServiceBase { private Thread writerThread; private Thread messageThread; private bool stopNow; public Service1() { } private void MessageThread() { while (st

我编写了一个窗口服务,如下所示:

  public partial class Service1 : ServiceBase
{
    private Thread writerThread;
    private Thread messageThread;
    private bool stopNow;

    public Service1()
    {
    }

    private void MessageThread()
    {
        while (stopNow == false)
        {
            try
            {
               //Do Something
                Thread.Sleep(10000);
            }
            catch (Exception e)
            {
                GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical);
                OnStop();
            }
        }
    }

    private void WriterThread()
    {
        bool checkGruppoIndirizzi = true;

        while (stopNow == false)
        {
            try
            {
                //Do something else
                Thread.Sleep(10000);
            }
            catch (Exception e)
            {
                GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical);
                OnStop();
            }
        }
    }

    protected override void OnStart(string[] args)
    {
        GLogWriter.Write("SERVICE IS STARTING", LogCategories.Generic, TraceEventType.Information);

        this.stopNow = false;

        writerThread = new Thread(new ThreadStart(this.WriterThread));
        writerThread.Start();

        this.messageThread = new Thread(new ThreadStart(this.MessageThread));
        this.messageThread.Start();
    }

    protected override void OnStop()
    {
        GLogWriter.Write("SERVICE IS STOPPING", LogCategories.Generic, TraceEventType.Information);
        stopNow = true;
        writerThread.Join(1000);
        messageThread.Join(1000);
        GLogWriter.Write("SERVICE STOP SUCCESSFUL", LogCategories.Generic, TraceEventType.Information);
    }
}
}


问题是,当我捕获到异常时,显然没有调用OnStop(),服务会立即停止,而不记录“服务正在停止”消息

请查看Windows事件日志,查看您收到的错误或异常类型。如果它是一个程序异常,那么它肯定会被捕获。所以我怀疑服务在系统级别引发异常


应该通过事件日志进行诊断。

这是因为以下行:

GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, e.InnerException.Message), LogCategories.Generic, TraceEventType.Critical);
InnerException
并不总是一个对象,它通常是
null

将该行更改为:

GLogWriter.Write(String.Format("Critical exception {0}. Inner Exception {1} ", e.Message, ((e.InnerException == null) ? string.Empty : e.InnerException.Message)), LogCategories.Generic, TraceEventType.Critical);

OnStop()
方法不应在服务线程停止工作时调用。这是一个特殊的过程,应该由服务控制经理调用。换句话说,
OnStop()
是在需要时正常停止服务的过程。有东西调用了
OnStop()
->服务已停止。这不是另一种方式(在服务->线程退出->
OnStop()
中发生的事情被调用)

显然这不会改变任何事情,因为该行已成功记录,并且innerException不为null。问题是对OnStop()的调用不起作用。另外,我认为使用第三级操作符代替这一行更好。
(e.InnerException??string.Emtpy)
@Federico通常您希望保持
在顶部()
覆盖。没有它,你就无法优雅地停止服务
OnStop()
类似于GUI应用程序的退出选项。您可以删除它,用户需要从任务管理器中删除该应用程序,但通常这不是一个好主意。