在前台线程的调用方法中捕获子后台线程
问题描述:
我想按指定的时间间隔(例如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时。
有没有更好的选择,它可以从被调用的方法中捕获异常或得到通知?
任何想法将非常感激!
答
这只是不可能的,Elapsed事件处理程序运行后面,以及您的Start()方法退出后。此外,该事件具有吞咽所有例外没有任何诊断的恶劣习惯。
您需要处理事件处理程序中的异常。当然不容易做到。请考虑使用System.Threading.Timer类来代替。至少你的程序将在回调引发异常时终止。
答
这是不可能的,因为异常是在设置定时器的不同执行上下文(线程)上引发的。
您应该处理回调方法中的任何异常。如果你希望你的逻辑与你的异常处理分离开来,只需创建一个单独的方法。
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
}
哪个定时器? ... – 2012-01-12 21:32:23
它是System.Timers – Pingpong 2012-01-12 21:35:03