2017-01-11 17 views
2

Global.asaxに次のコードがあると、最初にスローされた例外は正しく捕捉されますが、タイマー例外は発生しません。ASP.net Application_Start catch timer in timer

タイマーで例外をキャッチするには何を変更する必要がありますか?

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

? 'Timer'インスタンスのみを作成します。 –

+0

タイマーイベントハンドラーの中に 'try/catch'を入れる必要があります。 – Sinatr

答えて

1

あなたは、タイマーコールバック(あなたのケースでCode.Helpers.MyTimer.Process)内try/catchブロックを配置する必要があります。 System.Threading.Timerドキュメント(強調鉱山)から

2

は、指定された間隔でスレッドプールスレッド上の方法を実行するための機構を提供します。

またthisを読む価値があります:

それはThreadPoolのスレッドで呼び出されるためコールバックに指定した方法は、リエントラントでなければなりません。このメソッドは、タイマー間隔がメソッドの実行に必要な時間よりも短い場合、またはすべてのスレッドプールスレッドが使用中で、メソッドが複数回キューに入れられている場合に、2つのスレッドプールスレッドで同時に実行できます。

これは、タイマーに渡すデリゲートが、タイマーが存在する同じスレッドで呼び出されないことを意味します。タイマーイベントで例外を捕捉するには、そこに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)); 

そして、あなたのタイマーコード:2番目の `try`に期待していない例外

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