我有一个应用程序,需要在白天的某些时间触发几个事件 - 时间都是由用户定义的。我可以想到几种方法,但没有一种方法可以做得太好。时间不一定是特别高的分辨率 - 每一分钟左右都很好。
我的想法:
当应用程序启动时,所有时间都会读取并启动计时器,该计时器将在适当的时间打勾
启动计时器关闭'每分钟左右检查'当前事件'
以获得更好的解决方案。
答案 0 :(得分:4)
看看Quartz.Net。它是一个调度程序框架(最初用于Java)。
答案 1 :(得分:4)
显然,当您更改事件集或更改现有事件的时间时,您可能需要重置计时器以使其更早启动。通常没有必要将它重置为以后开火 - 你也可以让它一无所获。如果你把一个上限设置为计时器可以运行多长时间(或者只有1分钟的重复计时器),那么你可以在1分钟内获得精确度而无需重置。这基本上是你的选择2。
可以说你应该使用现有的框架而不是自己编辑,但我不知道C#所以我不知道有什么可用。我通常对设置更多计时器的想法持谨慎态度,因为某些环境不支持(或者不支持它)。因此这个方案只需要一个。我不知道C#在这方面是否有任何问题,但如果有必要,可以很容易地安排使用O(1)RAM,这是不可能的。
答案 2 :(得分:3)
这听起来像Windows服务的经典案例。我认为VS2005 / 2008中有一个Windows服务项目类型。该服务与简单的数据库和前端应用程序相结合,允许用户设置触发时间,这就是您所需要的。
如果不经常更改,则计划任务也是一种选择。
答案 3 :(得分:1)
我已经按照这些方针编写了一些程序。
我建议#2。您需要的只是保留事件“到期”的时间列表,并且每X个时间段(取决于您的分辨率)检查列表中的“现在”事件。如果您可以保证列表已排序,并且列表中的每个事件只发生一次,您可以选择一些优化。否则,如果您有重复活动,则必须确保覆盖窗口。我的意思是,如果你有一个事件应该在上午11:30到期,并且你每秒检查一次,那么你可以在11:29:59检查,然后再检查直到11:31: 01,由于CPU时间片的精确度。因此,您需要确保其中一个检查(11:29或11:31)仍然可以获得11:30的命中,并且只有其中一个检查(即,您不会同时运行11: 29和11:31)。
这种方法的优势在于只检查您知道列表上的时间是否允许第3方在您不知情的情况下修改您的列表,并且您的事件处理程序将继续“正常工作”。
答案 4 :(得分:0)
最简单的方法可能是使用Windows调度程序。
否则,您需要使用其中一个Timer类,计算第一个事件的持续时间。与调度程序不同,此方法允许运行进程找到新事件(并且可能重置计时器)。
答案 5 :(得分:0)
#1的问题在于事件发生之前的毫秒数可能太大而无法存储在Timer的间隔中,并且随着事件数量的增加,您的计时器数量可能会变得不合适。
我没有看到#2有什么问题,但我会选择后台工作者或线程。