2015-02-10 53 views
2

我需要帮助为我的应用程序设置特定类型的计时器。我的情况是这样的:需要计时器在特定时间和每5分钟直到作业完成时触发

我想在一天的特定时间运行一个计时器(比如4:00 AM)。然后,该计时器执行许多不同的事件,每个事件都会关闭,并从数据库中获取数据并对其进行处理(使用后台工作人员)。所有不同的事件需要不同的时间完成(可能是30秒,可能是5分钟)。我想每隔5分钟持续输入计时器事件,以检查是否所有事件都已完成。如果是这样,请停止定时器,并在第二天早上4:00再次重启,等等。

所以这个过程是这样的:

上午4点 - 启动计时器,并启动背景工人
上午04时05分 - 再次检查,看看是否进程已完成(如果是的话,停止定时器)
04:上午10点 - 再次检查过程是否已完成(如果是,请停止计时器)
依此类推......

我已经有了处理我的数据库信息的后台工作程序代码。所以我只需要帮助建立计时器。

到目前为止,我有我的Tick事件如下:

Private Sub tmr_Maintenance_Tick(sender As Object, e As EventArgs) Handles tmr_Maintenance.Tick 
    Dim CurrentTime As Date 
    Dim CurrHour As Integer 

     CurrentTime = DateTime.Now 
     CurrHour = CurrentTime.Hour 

     'Automatic Sales Import 
     With My.Settings 
      If CurrHour = 4 Then 

       If Not .Maintenance_Ran Then 
        CreateLog("Maintenance Started") 

        If Not .Yesterdays_Sales_Imported Then 
         CreateLog("Importing Yesterday's Sales From Portal") 
         If Not YesterdaysSales_Worker.IsBusy Then YesterdaysSales_Worker.RunWorkerAsync() 
        End If 

        If Not .WTD_Sales_Imported Then 
         CreateLog("Importing Week To Date Sales From Portal") 
         If Not WeekToDateSales_Worker.IsBusy Then WeekToDateSales_Worker.RunWorkerAsync() 
        End If 

        If Not .LW_Sales_Imported Then 
         CreateLog("Importing Last Week Sales From Portal") 
         If Not LastWeekSales_Worker.IsBusy Then LastWeekSales_Worker.RunWorkerAsync() 
        End If 

        If .Yesterdays_Sales_Imported = True And .WTD_Sales_Imported = True And .LW_Sales_Imported = True Then 
         .Maintenance_Ran = True 
        End If 
       End If 
      Else 
       .Maintenance_Ran = False 
      End If 
     End With 

    My.Settings.Save() 
End Sub 

任何帮助表示赞赏感谢。

+0

您列出的代码似乎与您的问题无关。你的计时器代码是什么样的? – CoderDennis 2015-02-10 21:19:52

+0

我列出的代码位于我的'Timer_Tick'事件中。我的计时器设置为每秒执行一次,并运行上面列出的代码。我只是显示所有数据处理的代码,因为我只需要帮助设置定时器。我更新了我的代码以正确显示我的Timer事件。 – Riples 2015-02-10 21:24:11

+0

好的。您的数据处理与定时器操作无关。根据当前小时查看你想要做的检查有助于知道如何回答。 – CoderDennis 2015-02-10 21:37:46

回答

1

这里有一个基本的框架,你就可以开始从:

Public Class Form1 

    Private Enum MaintenanceState 
     WaitingToStart 
     Started 
    End Enum 

    Private Target As DateTime 
    Private state As MaintenanceState = MaintenanceState.WaitingToStart 
    Private MaintenanceTime As New TimeSpan(4, 0, 0) ' 4:00 am 
    Private WaitingInterval As New TimeSpan(0, 5, 0) ' Five minutes 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Target = GetNextMaintenanceTarget(MaintenanceTime) 
     tmr_Maintenance.Interval = 1000 
     tmr_Maintenance.Start() 
    End Sub 

    Private Sub tmr_Maintenance_Tick(sender As Object, e As EventArgs) Handles tmr_Maintenance.Tick 
     ' optionally display time remaining until next target 
     Dim ts As TimeSpan = Target.Subtract(DateTime.Now) 
     Label1.Text = ts.ToString("hh\:mm\:ss") 

     ' see if we've hit the target 
     If DateTime.Now >= Target Then 
      tmr_Maintenance.Stop() 

      Select Case state 
       Case MaintenanceState.WaitingToStart 

        ' ... start all the jobs ... 

        state = MaintenanceState.Started 
        Target = DateTime.Now.Add(WaitingInterval) 

       Case MaintenanceState.Started 

        ' ... check to see if the jobs are all done ... 

        If Not AllJobsCompleted Then 
         Target = DateTime.Now.Add(WaitingInterval) 
        Else 
         state = MaintenanceState.WaitingToStart 
         Target = GetNextMaintenanceTarget(MaintenanceTime) 
        End If 

      End Select 

      tmr_Maintenance.Start() 
     End If 
    End Sub 

    Private Function GetNextMaintenanceTarget(ByVal time As TimeSpan) As DateTime 
     Dim dt As DateTime = DateTime.Today.Add(time) 
     If DateTime.Now > dt Then 
      dt = dt.AddDays(1) ' already past target time for today, next start is tomorrow 
     End If 
     Return dt 
    End Function 

End Class 
+0

完美谢谢。我已经实现了这一点,它的工作很棒!谢谢你的时间。唯一的问题是,您在“维护时间”声明中出现错字 - 将其设置为午夜4点而不是凌晨4点。再次感谢。 – Riples 2015-02-19 22:11:57

0

而不是解雇你的计时器每一秒,并检查当前的小时(这似乎有问题反正)为什么不计算多少毫秒到凌晨4点,并设置定时器在那时开火?

Dim timer = New Timer() 
timer.Interval = MillisecondsUntilNextFourAm 

... 

Function MillisecondsUntilNextFourAm() As Integer 
    Dim now = DateTime.Now() 
    If now.Hour < 4 Then 
     Return (TimeSpan.FromHours(4) - now.TimeOfDay).TotalMilliseconds 
    Else 
     Return (TimeSpan.FromHours(28) - now.TimeOfDay).TotalMilliseconds 
    End If 
End Function 

如果您希望计时器在5分钟内再次启动,您可以做类似的事情。我会将定时器的AutoReset属性设置为False,并在设置间隔后每次调用Start