如果时间赶上指定的 DateTime 对象,我可以使用 .NET 框架中的任何类来引发事件吗?
如果没有,检查时的最佳做法是什么?创建一个新线程不断检查?计时器(天堂禁止;))?
我不会采用线程方法。虽然睡眠线程不消耗用户 CPU 时间,但它确实使用内核/系统 CPU 时间。其次,在 .NET 中,您无法调整 Thread 的堆栈大小。因此,即使它所做的只是休眠,您也会遇到 2MB 的命中(我相信这是新线程的默认堆栈大小)。
使用 System.Threading.Timer。它使用高效的计时器队列。它可以有数百个轻量级计时器,并且只在所有计时器之间重用的 1 个线程上执行(假设大多数计时器没有同时触发)。
当一个线程处于睡眠状态时,它不会消耗 CPU 使用率。一个非常简单的方法是让一个线程休眠到 DateTime。例如
DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30));
new Thread(() =>
{
Thread.Sleep(future - DateTime.Now);
//RaiseEvent();
}).Start();
这基本上是说,获得未来的日期(从现在起三十秒)。然后创建一个线程,该线程将在不同的时间段内休眠。然后提出你的事件。
编辑:添加更多关于计时器的信息。计时器没有什么问题,但我认为它可能更有效。您可以有一个计时器,其时间间隔为时间差。当时间赶上日期时间对象时,这将导致 tick 事件触发。另一种我不会推荐的替代方法,我似乎认为您已经考虑过这一点,即每五秒关闭一次计时器并检查时间是否匹配。我会避免这种方法并坚持让线程休眠,直到有工作要做。
计时器可能不是一个坏方法。只需使用 DateTime.Now 来检测它是否超过目标时间。不要使用 == 除非您尝试将时间标准化为分钟或小时或其他内容。