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应用程序的退出选项。您可以删除它,用户需要从任务管理器中删除该应用程序,但通常这不是一个好主意。