2008-08-01 144 views
75

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

这个计时器在定时器控制中的工作方式被放在另一个线程上,所以它可以随着父线程不忙时在父线程上完成的工作始终打勾。

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

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

回答

48

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

15

考虑在处理结束时使用ManualResetEvent来阻塞主线程,并且一旦定时器处理完成,就调用Reset()。如果这需要不断运行,请考虑将其转换为服务进程而不是控制台应用程序。

相关问题