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