计时器在应用程序在 C# 中结束之前不会触发

本文关键字:结束 应用程序 计时器 | 更新日期: 2023-09-27 18:31:29

我在 C# 中有一个简单的控制台应用程序,它创建了一个计时器来将文本写入控制台。然后,它会等待用户按下某个键。

如果用户在五秒钟之前按下某个键,则应用程序将结束,计时器永远不会触发。如果用户未按某个键,则计时器将按预期触发。

为什么计时器创建的线程不会阻止应用程序终止?如何确保即使用户按下某个键,应用程序也能保持运行?

static void Main(string[] args)
    {
        System.Timers.Timer timer = new System.Timers.Timer(5000);
        timer.Interval = 5000; // 5 seconds
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;
        timer.AutoReset = true;
        timer.Start();
        Console.ReadKey();
    }
    public static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("Timer Fired.");
    }

计时器在应用程序在 C# 中结束之前不会触发

若要使计时器消息始终写出,可以让主线程等待触发计时器后发出信号的重置事件。

    static ManualResetEvent timerFired = new ManualResetEvent(false);
    static void Main(string[] args)
    {
        System.Timers.Timer timer = new System.Timers.Timer(5000);
        timer.Interval = 5000; // 5 seconds
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;
        timer.AutoReset = true;
        timer.Start();
        Console.ReadKey();
        // This call will return only after timerFired.Set() is
        // called.  So, if the user hits a key before the timer is
        // fired, this will block for a little bit, until the timer fires.  
        // Otherwise, it will return immediately
        timerFired.WaitOne();
    }
    public static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("Timer Fired.");
        timerFired.Set();
    }

至于另一个问题,为什么它不阻止应用程序退出,我会试一试。 正在从后台线程调用timer_Elapsed()。 根据 MSDN,后台线程不会保持执行环境运行。 这里有一个很好的讨论。

线程池线程

是后台线程,MSDN 计时器文档指示计时器的已用事件在线程池线程上引发,因此应用程序不会等待它,因为它不是前台线程。

相关文章: