2012-01-12 77 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 h从timer_Elapsed抛出异常,或者当发生异常时尝试调用timer_Elapsed时。

有没有更好的选择,它可以从被调用的方法中捕获异常或得到通知?

任何想法将非常感激!

+0

哪个定时器? ... – 2012-01-12 21:32:23

+0

它是System.Timers – Pingpong 2012-01-12 21:35:03

回答

2

这只是不可能的,Elapsed事件处理程序运行后面,以及您的Start()方法退出后。此外,该事件具有吞咽所有例外没有任何诊断的恶劣习惯。

您需要处理事件处理程序中的异常。当然不容易做到。请考虑使用System.Threading.Timer类来代替。至少你的程序将在回调引发异常时终止。

+0

但我可以在timer_Elapsed方法中捕获异常。 – Pingpong 2012-01-12 21:39:51

+0

但当然,你为什么不呢?请记录在某个地方,以便这不是完全不可观察的。 – 2012-01-12 21:46:30

+0

所以你可以确认start()不会捕获从timer_Elapsed抛出的异常,或者当试图调用timer_Elapsed时。 – Pingpong 2012-01-12 21:58:56

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 
}