在前景线程中调用方法内捕获子背景线程

时间:2012-01-12 21:27:14

标签: c#

我想按指定的时间间隔(例如3秒)调用一次方法,但是我在调​​用方法(例如Start)抛出的异常中遇到了异常,被调用的方法抛出(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_Elapsed抛出的异常,或者在异常发生时尝试调用timer_Elapsed。

是否有更好的替代方案,可以从被调用方法中捕获异常或获得通知?

任何想法都会非常感激!

2 个答案:

答案 0 :(得分:2)

这是不可能的,Elapsed事件处理程序稍后运行 ,就在您的Start()方法退出之后。此外,该事件具有吞咽所有例外的恶习,而无需任何诊断。

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

答案 1 :(得分: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
}