VB.net在预定时间执行任务

时间:2013-07-31 14:48:28

标签: vb.net

我需要使用用户输入的小时和分钟在特定时间执行任务。

我正在考虑使用某种循环,每次循环,检查Now().Hour匹配HourChoiceNow().Minute是否匹配MinuteChoice < / p>

在此,我还有一个用户选项可以选择“AM”或“PM”,如果TimeOfDay = "PM",则添加12个小时(Now().Hour是军事时间)。

编辑:我只想让它一次运行一次,而不是每天运行。

4 个答案:

答案 0 :(得分:2)

您可以使用System.Threading.Timer执行此操作。您可以将Timer的时间间隔设置为现在与所选时间之间的差异,而将TimerCallback设置为执行该时间的Sub,而不是经常运行和休眠的循环。任务工作。将超时设置为0或Timeout.Infinite将确保仅执行一次。

编辑:示例

Dim tcb As TimerCallback = AddressOf DoStuff
Dim t As Timer
Dim execTime As TimeSpan
Dim dtNow As DateTime = DateTime.Now
Dim hc As Integer = HourChoice
Dim mc As Integer = MinuteChoice

If TimeOfDay = "AM" And hc = 12 Then
    hc = 0
Else If TimeOfDay = "PM" Then
    hc = hc + 12
End If

Dim dtCandidate As DateTime = New DateTime(dtNow.Year, dtNow.Month, dtNow.Day, hc, mc, 0)

If dtCandidate < dtNow Then
    dtCandidate.AddDays(1)
End If

execTime = dtCandidate.Subtract(dtNow)
t = New Timer(tcb,Nothing,execTime,TimeSpan.Zero)

然后你只需要一个Sub来完成你的任务:

Public Sub DoStuff(obj As Object)
'...Do Some Kind of Work
End Sub

答案 1 :(得分:0)

你不必循环,
只需在表单中添加一个Timer,将其间隔设置为500,以便每500毫秒触发一次 通过按钮启用它以启动任务。

然后在你的Timer.Tick事件上:

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
       If Hour(Now) = HourChoice And Minute(Now) = MinuteChoice Then
            'Your Task Here
       End If
    End Sub

答案 2 :(得分:0)

未经测试但应该可行。在TimeSpan中,您可以设置天,小时,分钟,秒。

Private timer As System.Threading.Timer = New System.Threading.Timer(AddressOf DoWhatever, Nothing, New TimeSpan(0, 10, 0, 0), -1)

Private Sub dowhatever(sender As Object, e As Timers.ElapsedEventArgs)
   ' Do stuff
End Sub

更多信息可以在MSDN

找到

答案 3 :(得分:0)

添加这个问题的答案有点迟了,但是:您可以使用标准的System.Windows.Forms.Timer。将时间间隔设置为所需时间与Now()之间的差值(以毫秒为单位),然后启动计时器。