1

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

我正在考虑使用某种循环,每次循环时,检查 Now().Hour匹配项HourChoice和匹配项是否Now().Minute匹配MinuteChoice

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

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

4

4 回答 4

2

您可以使用 aSystem.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
于 2013-07-31T15:07:04.557 回答
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
于 2013-07-31T15:00:36.810 回答
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上找到

于 2013-07-31T15:21:19.870 回答
0

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

于 2017-07-13T07:19:05.420 回答