我知道在.NET中有三种计时器类型(请参见比较.NET Framework类库中的计时器类)。我选择了一个线程计时器,因为如果主线程忙碌,其他类型的计时器可能会偏移,而我需要它是可靠的。
这个计时器的工作方式是将计时器控制放在另一个线程上,这样当父线程不忙时,它可以始终保持运行。
在控制台应用程序中使用此计时器的问题是,当计时器在另一个线程上运行时,主线程没有执行任何操作,因此应用程序关闭。
我尝试添加一个while true
循环,但当计时器触发时,主线程太忙碌了。
您可以使用类似于Console.ReadLine()
的方法来阻塞主线程,这样其他后台线程(例如计时器线程)仍然可以工作。您还可以使用AutoResetEvent来阻塞执行,然后(在需要时)可以调用该AutoResetEvent对象上的Set() 方法来释放主线程。同时确保您对Timer对象的引用不会超出作用域并被垃圾回收。
Reset()
。如果需要连续运行,则考虑将其移动到服务进程中,而不是控制台应用程序中。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();
}