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