2012-01-12 12 views
0

メソッドを特定の間隔(たとえば3秒)で一度呼び出すが、呼び出されたメソッド(たとえば、開始)からスローされた呼び出しメソッドtimer_Elapsed)フォアグラウンドスレッドの呼び出しメソッド内で子のバックグラウンドスレッドをキャッチ

更新

public void Start() 
    { 
     Timer timer = new Timer(PingPeriod); //System.Timers 
     try 
     { 
      timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
      timer.Enabled = true; 

     } 
     catch (Exception ex) 
     { 
      //I want to catch exception thrown by timer_Elapsed 

     } 

     //Logic here that keeps the method running 
    } 

    private void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     throw new exception("Catch this exception please"); 
    } 

更新:

誰もが(という開始を確認してくださいことができますが)CATCません。例外が発生した場合はtimer_Elapsedを呼び出そうとしています。

呼び出されたメソッドから例外をキャッチしたり、通知を受け取ったりできる、より良い方法がありますか?

どのようなアイデアをいただければ幸いです。

+0

どのタイマー? ... –

+0

それはSystem.Timersです – Pingpong

答えて

2

これはちょうど不可能です。Elapsedイベントハンドラは、の後にを実行します。これは、Start()メソッドが終了した後です。さらに、このイベントでは、診断なしですべて例外を飲み込むという厄介な癖があります。

イベントハンドラ内で例外を処理する必要があります。確かにやりやすいことではありません。代わりにSystem.Threading.Timerクラスの使用を検討してください。コールバックが例外をスローすると、少なくともあなたのプログラムは終了します。

+0

しかし、私はtimer_Elapsedメソッド内で例外をキャッチすることができます。 – Pingpong

+0

もちろん、あなたはどうですか?これを完全に観測できないように、どこかに記録してください。 –

+0

これで、start()がtimer_Elapsedからスローされた例外をキャッチしないこと、またはtimer_Elapsedを呼び出そうとしていることを確認できます。 – Pingpong

0

タイマーを設定したものとは異なる実行コンテキスト(スレッド)で例外がスローされるため、これは不可能です。

コールバックメソッドで例外を処理する必要があります。ロジックを例外処理と区別したい場合は、別のメソッドを作成するだけです。

private void TimerElapsedCallback(object sender, ElapsedEventArgs e) 
{ 
    try 
    { 
     this.DoSomething(); 
    } 
    catch (Exception ex) 
    { 
     // handle 
    } 
} 

private void DoSomething() 
{ 
    // logic goes here and can be agnostic of any exceptions it throws, if desired 
} 
関連する問題