ASP.net Application_Start在计时器中捕获异常

时间:2017-01-11 13:44:21

标签: c# asp.net exception timer exception-handling

鉴于Global.asax中的以下代码,引发的第一个异常被正确捕获,但定时器异常不是。

我需要更改什么才能捕获计时器中的任何异常?

protected void Application_Start(object sender, EventArgs e)
{
    // THIS WORKS
    try
    {
        throw new Exception("Test!");
    }
    catch (Exception ex)
    {
        Code.Helpers.Error.Functions.RecordError(ex);
    }

    // THIS DOESN'T WORK
    try
    {
        var myTimer = new Timer(
            Code.Helpers.MyTimer.Process,
            null,
            new TimeSpan(0, 0, 0, 0),
            Settings.ProcessMyTimerEvery);
    }
    catch (Exception ex)
    {
        Code.Helpers.Error.Functions.RecordError(ex);
    }
}

2 个答案:

答案 0 :(得分:2)

来自System.Threading.Timer文档(强调我的):

  

提供以指定的时间间隔在线程池线程上执行方法的机制。

它还值得一读this

  

回调指定的方法应该是可重入的,因为它是在ThreadPool线程上调用的。如果定时器间隔小于执行方法所需的时间,或者所有线程池线程都在使用且方法排队多次,则可以在两个线程池线程上同时执行该方法。

这意味着传入计时器的委托不会在计时器所在的同一线程上调用。要捕获计时器事件中的异常,您需要将try / catch放在那里。例如:

var myTimer = new Timer(
    TimerEvent, //<-- A delegate to the TimerEvent method
    null, 
    new TimeSpan(0, 0, 0, 0), 
    new TimeSpan(0, 0, 0, 5));

您的计时器代码:

private void TimerEvent(object x)
{
    try
    {
        throw new Exception("Exception in timer event");
    }
    catch (Exception ex)
    {
        Code.Helpers.Error.Functions.RecordError(ex);
    }
}

答案 1 :(得分:1)

您应该将try / catch块放在计时器回调中(Code.Helpers.MyTimer.Process)。