定时器.定时器vs线程.控制台应用程序上的计时器

本文关键字:定时器 程序上 计时器 应用程序 应用 vs 线程 控制台 | 更新日期: 2023-09-27 18:18:53

我注意到计时器。定时器和线程。计时器在控制台应用程序上的行为不同。看起来像在ThreadingTimer的回调,如果我抛出一个异常,它会崩溃的应用程序。然而,如果我抛出一个异常在timertimer经过的处理程序,它不会崩溃。

两个方法都在线程池中的工作线程上执行。我推测,ThreadingTimer以某种方式将异常传播到主线程,而timertimer则没有。

我在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");
    }
}

定时器.定时器vs线程.控制台应用程序上的计时器

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

Timer组件捕获并抑制由流逝事件的事件处理程序。这种行为是服从的

有趣的是,这种行为从。net 1.1开始就存在了,所以看起来不会马上改变。