如何创建许多事件而不创建许多计时器对象

时间:2019-05-13 14:12:33

标签: c#

我正在设置一个系统,以允许用户创建以各种时间间隔运行的自定义查询。因此,我可以每7分钟运行7个,每6分钟运行10个,每10分钟运行3个。 (尽管可能更多)。不用创建一堆计时器对象的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

一种方法是让计时器每分钟滴答滴答,并有一个跟踪分钟的变量。然后,当分钟是所需时间的倍数时,使用if语句执行任务。这样,您可以让一个计时器提供多个间隔。

例如:

private int timerCount = 0;

private void Timer_Tick(object sender, EventArgs e)
{
    //Increase this counter each time the timer ticks.
    timerCount++;

    if (timerCount % 3 == 0)
    {
        //Do tasks that should execute every 3 minutes
    }

    if (timerCount % 10 == 0)
    {
        //Do tasks that should execute every 10 minutes
    }
}

答案 1 :(得分:0)

由于用户创建了这些任务,因此您必须将它们存储在某个地方,可能是数据库。该问题并未指定用户如何定义任务,但这并不是问题的核心。

在数据库中,您可能有两个表。一种是任务的定义,其中包括应在其后运行的时间间隔。根据预期用途,可以将其存储在几分钟或几秒钟内。

另一个表将包含执行这些任务的历史记录。每次执行任务时,都存储一条新记录。它也可能包括结果。

然后,每分钟(或大约每分钟)检索一次加入历史记录的任务列表,以显示每个任务的最新执行情况。一次一次,将上一次执行时间与时间间隔进行比较。那减去两个日期/时间。

var minutesSinceLastExecution = (lastExecutionDateTime - DateTime.Now).TotalMinutes;
if (minutesSinceLastExecution >= minutesInterval)
    // execute the query

然后,在执行查询后,插入一个新的历史记录。

这是一个基本的大纲,仍然有一些未解决的问题。例如,查询运行所花费的时间是否可以长于该间隔?您是否需要同时运行不相关的查询?您仍然必须找出一些细节,这可能涉及存储更多数据。例如,您可能希望指示查询正在执行,以便随后的间隔不会开始执行同一查询。如果您也将详细信息存储在数据库中,则您的过程可以根据需要跨多个服务器扩展。