控制器应用程序上的Timers.Timer与Threading.Timer

时间:2014-08-19 16:25:23

标签: c# multithreading timer

我注意到Timers.Timer和Threading.Timer在控制台应用程序上的行为有所不同。看起来像ThreadingTimer的回调,如果我抛出一个异常,它会崩溃应用程序。但是,如果我在TimersTimer经过的处理程序中抛出异常,它将不会崩溃它。

这两个方法都是在线程池的工作线程上执行的。我推测ThreadingTimer以某种方式将异常传播到主线程而TimersTimer不会。

我在MSDN中找不到这种行为的解释,你能帮我解决这个问题吗?

以下是行为示例:

class Program
{
    static void Main(string[] args)
    {
        var healthMonitor = new HealthMonitor();
        healthMonitor.Start();
        Console.ReadLine();
    }
}

internal class HealthMonitor
{
    private Timer _timersTimer;
    private System.Threading.Timer _threadingTimer;

    public void Start()
    {
        StartTimersTimer(); 
        // StartThreadingTimer();
    }

    private void StartThreadingTimer()
    {
        _threadingTimer = new System.Threading.Timer(
            ThreadingTimerCallback,
            null,
            TimeSpan.FromMilliseconds(5000),
            TimeSpan.FromMilliseconds(5000));
    }

    private void ThreadingTimerCallback(object state)
    {
        Console.WriteLine("Throwing from ThreadingTimer..");
        throw new Exception("Exception from ThreadingTimer");
    }

    private void StartTimersTimer()
    {
        Console.WriteLine("Starting timers...");
        _timersTimer = new Timer(5000);
        _timersTimer.Elapsed += TimersTimer_Elapsed;
        _timersTimer.Enabled = true;
    }

    private void TimersTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Throwing from TimersTimer...");
        throw new Exception("Exception from TimersTimer");
    }
}

1 个答案:

答案 0 :(得分:0)

正如HansPassant,mike z和Cody Gray所说,答案是在MSDN中,特别是:

  

Timer组件捕获并抑制所引发的所有异常   Elapsed事件的事件处理程序。此行为受制于   在.NET Framework的未来版本中进行更改。

有趣的是,自.Net 1.1以来,这种行为就出现了,所以看起来变化并不迫在眉睫。