2017-01-11 2 views
2

Учитывая следующий код в Global.asax, первое исключение выбрано правильно, но исключение таймера не является.ASP.net Application_Start исключение catch в таймере

Что мне нужно изменить, чтобы поймать какие-либо исключения в таймере?

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

Какое исключение вы ожидаете второй 'try'? Вы создаете экземпляр «Timer». –

+0

Вам нужно поместить 'try/catch' внутри обработчика события таймера. – Sinatr

ответ

1

Вы должны поместить блок try/catch внутри обратного вызова таймера (Code.Helpers.MyTimer.Process в вашем случае).

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); 
    } 
} 
Смежные вопросы