C# 在前台线程中的调用方法内捕获子后台线程

C# 在前台线程中的调用方法内捕获子后台线程,c#,C#,我想按指定的时间间隔(例如3秒)调用一次方法,但在捕获被调用方法抛出的调用方法(例如开始)内的异常时遇到问题(计时器已过) 更新 public void Start() { Timer timer = new Timer(PingPeriod); //System.Timers try { timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

我想按指定的时间间隔(例如3秒)调用一次方法,但在捕获被调用方法抛出的调用方法(例如开始)内的异常时遇到问题(计时器已过)

更新

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时引发的异常。询问并回答。你在找一台时间机器。时间倒流在软件中是有可能的。前进是个大问题。只有在《金融法典》中才有可能预测未来。