2008-10-15 21 views
1

.NET框架中是否有任何类可用于在时间赶上指定的DateTime对象时引发事件?检查指定日期何时发生的最佳方法

如果没有,检查时有哪些最佳实践?创建一个新的线程不断检查?一个计时器(天堂禁止;))?

回答

4

我不会用线程方法。虽然睡眠线程不消耗用户CPU时间,但它确实使用内核/系统CPU时间。其次,在.NET中,您无法调整线程的堆栈大小。所以,即使它只是在睡眠,你仍然坚持2MB的命中(我相信这是一个新线程的默认堆栈大小)。

使用System.Threading.Timer。它使用高效的计时器队列。它可以拥有数百个轻量级定时器,并且只能在所有定时器之间重用的1个线程上执行(假定大多数定时器不同时触发)。

0

当线程休眠时,它不消耗CPU使用。一个非常简单的方法是让一个线程休眠到DateTime。例如,

DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30)); 
     new Thread(() => 
     { 
      Thread.Sleep(future - DateTime.Now); 
      //RaiseEvent(); 
     }).Start(); 

这基本上说,将来会有一个日期(从现在起三十秒)。然后创建一个线程,睡眠时间的差异。然后举起你的活动。

编辑:添加一些关于定时器的更多信息。定时器没有问题,但我认为这可能是更多的工作。你可以有一个间隔时间差的计时器。这会在时间赶上日期时间对象时触发滴答事件。 另一种我不会推荐的方法,我似乎认为你有这个,但每五秒钟就会有一个计时器,并检查时间是否匹配。我会避免这种做法,并坚持让线程睡觉,直到有工作要做。

+0

当您的应用程序被告知退出时(如果退出发生在时间发生之前),会长时间睡眠的线程会干干净净地死掉吗? – 2008-10-16 01:50:44

+0

使用ManualResetEvent可以模拟当您希望退出应用程序时非常敏感的睡眠模式。 myEvent.WaitOne(未来 - Datetime.now) ... 然后从你的主线程,当你想退出,只是myEvent.Set ... 如果线程超时,你有你的时间..如果它被解雇,你正在退出 – 2009-06-18 23:07:05

0

计时器可能并不是一个坏的方法。只需使用DateTime.Now来检测它是否超过了目标时间。不要使用==,除非您尝试将时间归一化为分钟或小时等。

相关问题