我有一个需要在VB.net中使用计时器每15分钟运行一次的功能。
但这里出现的挑战是,如果我启动计时器,比如凌晨2点,实际功能将在凌晨2:15执行,之后每隔15分钟执行相同的功能。
我有一个子“Timer”,其中定时器启动,Addhandler操作员每15分钟调用一次“ONhandler”函数。
private mytimer as timer
private sub Timer()
{
with mytimer
.autoreset=true
.enabled=true
.interval=900000
.start
end with
AddHandler mytimer.elapsed ,assressof onhandler
console.readkey()
}
onhandler(byval source as oblject,byval e as elapsedeventargs)
{
Performs the DB operations.
}
最初,我有一些逻辑可以在每小时的每个00,15,30,45分钟准确启动计时器。假设我在凌晨1:55启动应用程序,逻辑将确保应用程序睡眠直到凌晨2:00和凌晨2:00,计时器将启动 。 15分钟后,即凌晨2:15,该功能将被执行。
但我需要的是,我不希望我的申请从2:00到2:15等待15分钟。相反,它应该在2:00处理,然后启动计时器。为了解决这个问题,我添加了一个新的函数“onhandler”,它具有相同的AddHandler方法,它执行相同的过程。
private sub Timer()
{
onhandler() ****New function namesd as AddHandler method
with mytimer
.autoreset=true
.enabled=true
.interval=900000
.start
end with
AddHandler mytimer.elapsed ,assressof onhandler
console.readkey()
}
onHandler()
{
Do same DB function
}
实施新逻辑后, 如果我在凌晨1:55启动应用程序,我的应用程序将睡到凌晨2:00,之后sub中的Onhandler()方法将首先执行,它将在2:01Am完成。 现在定时器启动15分钟,下一组过程在凌晨2:16执行,因为定时器设置为15分钟。但我需要我的进程准确地在凌晨2:15运行。换句话说,定时器间隔必须持续14分钟而不是15分钟。
另一个例子是,我在凌晨3点开始申请,如果它在3:03Am结束,则下次运行的时间间隔必须为12分钟而不是15分钟。
根据流程结束时间,有没有办法让每个流程完成的定时器间隔动态???
PS:我是DotNet的新手,过去几天一直在讨论这个问题。伙计们,请帮助我。
提前致谢, 马杜。
答案 0 :(得分:1)
执行此操作的正确方法是在特定时间运行Windows Task。但是如果你真的想在你的应用程序中写这个,你可以每分钟唤醒程序来检查时间,然后将其添加到被调用的方法中:
Dim d = DateTime.Now
if(Not (d.Minute = 0 OrElse d.Minute = 15 OrElse d.Minute = 30 OrElse d.Minute = 45)) Then
Return 'Quits if the current time is not right
End If
答案 1 :(得分:0)
我曾经有类似的东西。我将有一个名为NextExecutionTime的变量,它将包含下次需要执行该进程的时间。
起初它将是(例子)凌晨2点。
然后我会每分钟都有一个计时器,如果当前时间等于或大于NextExecutionTime,我会执行该过程并将NextExecutionTime变量设置为下次我希望该进程运行。