控制台应用程序中的可靠计时器

时间:2008-08-01 12:43:12

标签: c# .net vb.net timer

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

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

控制台应用程序中此计时器的问题是,当计时器正在另一个线程上时,主线程没有对应用程序执行任何操作。

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

3 个答案:

答案 0 :(得分:52)

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

答案 1 :(得分:17)

考虑使用ManualResetEvent在处理结束时阻塞主线程,并在定时器处理完成后调用Reset()。如果需要不断运行,请考虑将其移至服务流程而不是控制台应用程序。

答案 2 :(得分:0)

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

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();
}