我正在设置一个系统,以允许用户创建以各种时间间隔运行的自定义查询。因此,我可以每7分钟运行7个,每6分钟运行10个,每10分钟运行3个。 (尽管可能更多)。不用创建一堆计时器对象的最佳方法是什么?
答案 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
然后,在执行查询后,插入一个新的历史记录。
这是一个基本的大纲,仍然有一些未解决的问题。例如,查询运行所花费的时间是否可以长于该间隔?您是否需要同时运行不相关的查询?您仍然必须找出一些细节,这可能涉及存储更多数据。例如,您可能希望指示查询正在执行,以便随后的间隔不会开始执行同一查询。如果您也将详细信息存储在数据库中,则您的过程可以根据需要跨多个服务器扩展。