Windows服务异常处理和计时器

时间:2014-08-01 06:49:15

标签: c# multithreading exception-handling windows-services system.timers.timer

我遇到System.Timers.Timer的问题。 确切地说,它不会抛出任何异常。这是我的代码:

private Timer MyTimer { get; set; }

public MyService()
{
    InitializeComponent();
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    MyTimer = new Timer(10 * 1000);
    MyTimer.Elapsed += MyTimer_Elapsed;
}

protected override void OnStart(string[] args)
{
    MyTimer.Enabled = true;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    if (!EventLog.SourceExists(EVENTLOGSOURCE))
    {
        EventLog.CreateEventSource(EVENTLOGSOURCE, EVENTLOGDESCRIPTION);
    }
    EventLog.WriteEntry(EVENTLOGSOURCE, "UnhandledException\r\n" + e.ExceptionObject, EventLogEntryType.Error);
    EventLog.WriteEntry(EVENTLOGSOURCE, "UnhandledExceptionEventArgs.IsTerminating: " + e.IsTerminating, EventLogEntryType.Error);

    if (e.IsTerminating)
    {
        this.ExitCode = 100;
        //this.Stop();
    }
}

private void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    MyTimer.Enabled = false;
    CurrentDomain_UnhandledException(AppDomain.CurrentDomain, new UnhandledExceptionEventArgs(new Exception("FakeExceptionForTestPurposeOnly: It will be logged!"), false));

    Int32 i = Convert.ToInt32("10_ForSureGeneratesException_10");
}

所以,在我的事件日志中,我可以找到" FakeExceptionForTestPurposeOnly:它将被记录!"但它是唯一的一个!

毕竟,最糟糕的部分是它仍在运行的服务。 怎么可能呢?

请注意我已经解决了问题,在这种情况下,使用计时器不是强制性的。 System.Threading.Thread可以完成这项工作并作为发条工作。我只是好奇,我猜...

所以问题是:为什么在MyTimer_Elapsed()" CurrentDomain_UnhandledException(对象发送者,UnhandledExceptionEventArgs e)"中出现任何UnhandledExceptions期间永远不会被解雇?

任何帮助,建议,评论将不胜感激

1 个答案:

答案 0 :(得分:3)

在Windows服务中," Main"线程由Service Control Manager拥有,OnStart调用OnStopServiceBase方法。当它的" Main"发生异常时线程,SynchronizationContext类负责异常处理,因此处理异常并且不会将其传播到调用链。

虽然Windows服务中应该没有Elapsed,因此应该在另一个ThreadPool主题上触发System.Threading.Timer事件,我建议您尝试Elapsed相反,看看当{{1}}事件调用你的回调时异常是否传播。