C# 在前台线程中的调用方法内捕获子后台线程
我想按指定的时间间隔(例如3秒)调用一次方法,但在捕获被调用方法抛出的调用方法(例如开始)内的异常时遇到问题(计时器已过) 更新C# 在前台线程中的调用方法内捕获子后台线程,c#,C#,我想按指定的时间间隔(例如3秒)调用一次方法,但在捕获被调用方法抛出的调用方法(例如开始)内的异常时遇到问题(计时器已过) 更新 public void Start() { Timer timer = new Timer(PingPeriod); //System.Timers try { timer.Elapsed += new ElapsedEventHandler(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");
}
更新:
任何人都可以确认start()不会捕获从timer_Appeased引发的异常,或者在尝试调用timer_Appeased时(如果发生异常)不会捕获异常
有没有更好的替代方法,可以从被调用的方法捕获异常或得到通知
任何想法都将不胜感激 这是不可能的,经过的事件处理程序会在Start()方法退出后运行。此外,该事件有一个令人讨厌的习惯,即在没有任何诊断的情况下吞咽所有异常
您需要在事件处理程序中处理异常。当然不容易做到。请考虑使用Stult.thordy.定时器类。回调引发异常时,至少您的程序将终止。这是不可能的,因为异常是在与设置计时器的执行上下文(线程)不同的执行上下文(线程)上引发的 您应该处理回调方法中的任何异常。如果希望将逻辑与异常处理分开,只需创建一个单独的方法
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
}
但我可以在timer_persed方法中捕获异常。当然,您为什么不呢?请将其记录在某个位置,这样就不会完全无法观察到。因此,您是否可以确认start()不会捕获从timer_Appeased引发的异常,或者在尝试调用timer_Appeased时引发的异常。询问并回答。你在找一台时间机器。时间倒流在软件中是有可能的。前进是个大问题。只有在《金融法典》中才有可能预测未来。