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

114

我知道在.NET中有三种计时器类型(请参见比较.NET Framework类库中的计时器类)。我选择了一个线程计时器,因为如果主线程忙碌,其他类型的计时器可能会偏移,而我需要它是可靠的。

这个计时器的工作方式是将计时器控制放在另一个线程上,这样当父线程不忙时,它可以始终保持运行。

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

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

3个回答

63

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


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接