110

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

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

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

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

4

3 回答 3

62

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

于 2008-08-01T12:56:37.920 回答
22

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

于 2008-08-01T12:55:42.413 回答
1

根据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();
}
于 2020-12-10T16:48:40.317 回答