如何编写基于定义的计划启动应用程序的应用程序启动器

时间:2015-03-22 19:28:03

标签: vb.net scheduler launch

我必须编写一个应用程序,我可以将程序定义为在特定时间,特定日期运行,并以特定间隔运行。

  1. A.exe必须在每个月的第1天和第15天上午8:00运行。

  2. B.exe必须在每个月的16日和31日上午8:30运行。如果 月份没有31天,然后在最后一次运行第31个实例 这个月的某一天。

  3. C.exe必须在每个的第1个和第3个星期一运行 月份上午9:00
  4. D.exe必须在每个工作日凌晨4:00运行,每30个运行一次 在那之后的几分钟直到晚上11点。
  5. 我需要能够查看每个任务的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
    

    感谢任何指导。

1 个答案:

答案 0 :(得分:0)

个人处理这样的进程的最好方法(大多数是安全的)要么是编写一个在后台不断运行的服务,但由于你的运行时间太远,我会添加一个计划任务,以便windows启动您的应用并让您的应用在构建时设置以下计划任务。

请参阅 - Setting up a scheduled task in .Net