我必须编写一个应用程序,我可以将程序定义为在特定时间,特定日期运行,并以特定间隔运行。
A.exe必须在每个月的第1天和第15天上午8:00运行。
B.exe必须在每个月的16日和31日上午8:30运行。如果 月份没有31天,然后在最后一次运行第31个实例 这个月的某一天。
我需要能够查看每个任务的LastRunTime并找出NextRunTime。
我正在寻找关于如何最好地编写此算法的建议/指示。我正在考虑解析输入字符串,如下所示:
DayOfMonth=1,15;StartTime=00:00:01;EndTime=23:59:59;Interval=1:30:00
or
DayOfWeek=Mon,1,3|Wed,2,4;StartTime=00:00:01;EndTime=23:59:59;Interval=1:30:00
or
DayOfWeek=Mon|Tue|Wed|Thu|Fri;StartTime=08:00:00;EndTime=23:00:00;Interval=00:30:00
第二个字符串表示1st&每个月的第3个星期一和第2个&每个月的第四个星期三。
第3个字符串基本上表示每个工作日。
我将让UI允许用户设置参数,它将生成要传递给任务处理程序的字符串。
我已经开始编写代码来解析“DayOfMonth”字符串,它没有经过测试,我意识到它没有考虑月份的天数是否少于应该运行的天数。这是:
Private Sub GetNextRuntime()
Dim st As Date
If ScheduleValue("DayOfMonth") <> "" Then
For Each s As String In ScheduleValue("DayOfMonth").Split(",")
If IsNumeric(s) Then
If CInt(s) >= Now.Day Then
If IsDate(ScheduleValue("StartTime")) Then
st = CDate(ScheduleValue("StartTime"))
If st.TimeOfDay >= Now.TimeOfDay Then
NextRunTime = New Date(st.Year, st.Month, st.Day, st.Hour, st.Minute, st.Second)
Exit Sub
ElseIf LastRunTime.Date <> Now.Date Then
NextRunTime = New Date(Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second).AddMinutes(Rnd(0, 59))
Exit Sub
End If
Else
Throw New Exception("Invalid StartTime value for Task id " & TaskId)
End If
End If
Else
Throw New Exception("Invalid DayOfMonth value in Task Id " & TaskId)
End If
Next
st = CDate(ScheduleValue("StartTime"))
NextRunTime = New Date(Now.Year, Now.Month, CInt(ScheduleValue("DayOfMonth").Split(",")(0)), st.Hour, st.Minute, st.Second).AddMonths(1)
End If
End Sub
Private Function ScheduleValue(ByVal ParamName As String) As String
With New Regex(ParamName & "=(?<Value>.*?);")
If .IsMatch(Schedule) Then
ScheduleValue = .Match(Schedule).Groups("Value").Value
Else
ScheduleValue = ""
End If
End With
End Function
感谢任何指导。
答案 0 :(得分:0)
个人处理这样的进程的最好方法(大多数是安全的)要么是编写一个在后台不断运行的服务,但由于你的运行时间太远,我会添加一个计划任务,以便windows启动您的应用并让您的应用在构建时设置以下计划任务。