代码之家  ›  专栏  ›  技术社区  ›  PaulB

在一天中的特定时间启动事件的好方法?

  •  5
  • PaulB  · 技术社区  · 16 年前

    我有一个应用程序,需要在一天中的特定时间触发几个事件-时间都由用户定义。我可以想出几种方法来做这件事,但没有一种方法做得太好。计时不一定要有特别高的分辨率——每种方式一分钟左右就可以了。

    1. 当应用程序启动时,读取所有时间并关闭将在适当时间滴答响的启动计时器

    tia寻求更好的解决方案。

    6 回复  |  直到 16 年前
        1
  •  4
  •   kgiannakakis    16 年前

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

        2
  •  4
  •   Steve Jessop    16 年前
    • 存储/索引按事件下次需要注意的时间排序的事件。这可能在内存中,也可能不在内存中,这取决于有多少个,您进行更改的频率,等等。如果您的所有事件每天触发一次,则此列表基本上是一个循环缓冲区,仅当用户更改其事件时才会更改。
    • 当计时器启动时,处理所有过去发生的事件[编辑-以及尚未处理的事件],必要时将其重新插入列表(即,如果您没有“循环缓冲区”优化),并设置新的计时器。

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

        3
  •  3
  •   Dave Swersky    16 年前

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

        4
  •  1
  •   GWLlosa    16 年前

    我已经按照这些思路编写了一些程序。

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

        5
  •  0
  •   Richard    16 年前

    否则,您需要使用一个计时器类,计算距离第一个事件的时间。与调度器不同的是,这种方法允许运行进程发现新事件(并可能重置计时器)。

        6
  •  0
  •   John Gietzen    16 年前

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