【问题标题】:Reliable timer in a console application控制台应用程序中的可靠计时器
【发布时间】:2025-11-24 17:15:01
【问题描述】:

我知道.NET 中有三种计时器类型(请参阅Comparing the Timer Classes in the .NET Framework Class Library)。我选择了一个线程定时器,因为如果主线程很忙,其他类型的定时器可能会漂移,我需要它是可靠的。

这个计时器在计时器控制下的工作方式被放在另一个线程上,因此它总是可以在不忙时随着父线程上的工作开始完成。

这个计时器在控制台应用程序中的问题是,当计时器在另一个线程上计时,主线程没有对应用程序关闭做任何事情。

我尝试添加一个while true 循环,但是当计时器停止时主线程太忙了。

【问题讨论】:

    标签: c# .net vb.net timer


    【解决方案1】:

    您可以使用Console.ReadLine() 之类的东西来阻塞主线程,这样其他后台线程(如计时器线程)仍然可以工作。您也可以使用AutoResetEvent 来阻止执行,然后(当您需要时)您可以在该 AutoResetEvent 对象上调用 Set() 方法来释放主线程。还要确保您对 Timer 对象的引用不会超出范围并被垃圾回收。

    【讨论】:

      【解决方案2】:

      考虑在处理结束时使用ManualResetEvent 阻塞主线程,并在计时器处理完成后对其调用Reset()。如果这需要持续运行,请考虑将其移动到服务进程而不是控制台应用程序中。

      【讨论】:

        【解决方案3】:

        根据MSDN 和其他答案,使用 System.Threading.Timer 而不立即退出的控制台应用程序的最小工作示例:

        private static void Main()
        {
            using AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            using Timer timer = new Timer(state => Console.WriteLine("One second has passed"), autoResetEvent, TimeSpan.Zero, new TimeSpan(0, 0, 1));
            autoResetEvent.WaitOne();
        }
        

        【讨论】:

          最近更新 更多