在一天中的特定时间举办活动的好方法?

时间:2009-04-07 14:08:02

标签: c# events

我有一个应用程序,需要在白天的某些时间触发几个事件 - 时间都是由用户定义的。我可以想到几种方法,但没有一种方法可以做得太好。时间不一定是特别高的分辨率 - 每一分钟左右都很好。

我的想法:

  1. 当应用程序启动时,所有时间都会读取并启动计时器,该计时器将在适当的时间打勾

  2. 启动计时器关闭'每分钟左右检查'当前事件'

  3. 以获得更好的解决方案。

6 个答案:

答案 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有什么问题,但我会选择后台工作者或线程。