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

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

我的想法:

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

  2. 关闭计时器,每分钟左右检查’当前事件’

为任何更好的解决方案。

  • 存储/索引按下次需要注意的时间排序的事件。 这可能是在内存中,也可能不是根据存在的数量,您进行更改的频率等等。如果您的所有事件每天都会触发一次,则此列表基本上是一个循环缓冲区,只有在用户更改其事件时才会更改。
  • 启动一个计时器,该计时器将在列表头部的事件发生时“打勾”。 如果你愿意,可以直到下一分钟。
  • 当计时器触发时,处理现在过去的所有事件[编辑 – 并且尚未处理],如有必要,将它们重新插入列表(即,如果您没有“循环缓冲区”优化),并设置一个新的计时器。

显然,当您更改事件集或更改现有事件的时间时,您可能需要重置计时器以使其更早启动。 通常没有必要将它重置为以后开火 – 你也可以让它一无所获。 如果你把一个上限设置为计时器可以运行多长时间(或者只有1分钟的重复计时器),那么你可以在1分钟内获得精确度而无需重置。 这基本上是你的选择2。

可以说你应该使用一个现有的框架而不是自己的框架,但我不知道C#所以我不知道有什么可用。 我通常对设置更多计时器的想法持谨慎态度,因为某些环境不支持(或者不支持它)。 因此这个方案只需要一个。 我不知道C#在这方面是否有任何问题,但是这个方案可以很容易地安排在必要时使用O(1)RAM,这是不可能的。

看看Quartz.Net 。 它是一个调度程序框架(最初用于Java)。

这听起来像是Windows服务的经典案例。 我认为VS2005 / 2008中有一个Windows服务项目类型。 该服务与简单的数据库和前端应用程序相结合,允许用户设置触发时间,这就是您所需要的。

如果它不会经常更改,则计划任务也是一种选择。

我沿着这些方向编写了一些程序。

我建议#2。 您需要的只是保留事件“到期”的时间列表,每X个时间段(取决于您的分辨率)检查列表中的“现在”事件。 如果您可以保证列表已排序,并且列表中的每个事件只发生一次,您可以选择一些优化。 否则,如果您有重复发生的事件,您必须确保覆盖窗口。 我的意思是,如果你有一个事件应该在上午11:30到期,并且你每秒都在检查,那么你有可能在11:29:59检查,然后再检查直到11:31: 01,由于CPU时间片的精确度。 因此,您需要确保其中一个检查(11:29或11:31)仍然可以获得11:30的命中,并且只有其中一个检查(即,您不会同时运行11: 29和11:31)。

这种方法的优势在于只检查您知道列表中的时间,这样可以让您在不知情的情况下由第三方修改您的列表,并且您的事件处理程序将继续“正常工作”。

最简单的方法可能是使用Windows调度程序。

否则,您需要使用其中一个Timer类,计算第一个事件的持续时间。 与调度程序不同,此方法允许运行进程找到新事件(并且可能重置计时器)。

#1的问题在于事件之前的毫秒数可能太大而无法存储在Timer的间隔中,并且随着事件数量的增加,您的计时器数量可能会变得非常不合理。

我没有看到#2有什么问题,但我会选择后台工作者或线程。