【问题标题】:How to write an app launcher that launches apps based on defined schedules如何编写一个基于定义的时间表启动应用程序的应用程序启动器
【发布时间】:2015-03-22 19:28:02
【问题描述】:

我必须编写一个应用程序,我可以在其中定义程序以在特定时间、特定日期和特定时间间隔运行。

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

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

  3. C.exe 必须在每个星期一和第三个星期一运行 每月上午 9:00
  4. D.exe 必须在每个工作日的凌晨 4:00 和每 30 点运行一次 之后几分钟直到晚上 11:00。

我需要能够查看每个任务的 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

第二个字符串表示每个月的第一个和第三个星期一以及每个月的第二个和第四个星期三。

第三个字符串基本上是每个工作日。

我会让用户界面允许用户设置参数,它会生成字符串以传递给任务处理程序。

我已经开始编写代码来解析“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

感谢任何指导。

【问题讨论】:

  • 我将补充一点,应用启动程序将从数据库获取模拟凭据并使用这些凭据启动任务。它将在自动登录的电脑上设置,并在启动时启动。这是因为我们希望看到正在运行的应用(所有控制台应用)。

标签: vb.net scheduler launch


【解决方案1】:

就个人而言,处理此类进程的最佳方式(最安全)是编写一个在后台持续运行的服务,但由于您的运行时间太远,我会添加一个计划任务,以便 Windows启动您的应用并让您的应用在构建时设置以下计划任务。

见 - Setting up a scheduled task in .Net

【讨论】:

  • 谢谢。但我正在寻找有关如何编写算法以根据上次运行时间和调度参数确定下一次运行时间的指导。其余的已经决定了。
  • 从您的示例看来,您必须处理的唯一 a & b c & d 将专注于自己的模式,例如 'if(day =1){ A();} A ->nexttask = (month/2) B->nexttask = A->nexttask +1 (一旦他们完成)B->nexttask = (lastday(month))
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多