这是如何做到最好?我想这是一个服务器上运行的应用程序每天晚上03:00触发一个事件。

有帮助吗?

解决方案

使用Windows任务计划

其他提示

如果你想这样做,在运行的应用程序代码(而不是使用任务调度器),你应该选择一个时间,让您的应用程序的睡眠这是相当长的(例如,1小时,或3600秒)。您的应用程序循环,并在每个睡眠期权到期,该应用程序会定期检查多少时间留到截止时间(03:00)。一旦剩余的睡眠时间变下面粗略的间隔时间,它应减少到较短的时间间隔(每次减半,或降低到10秒)。继续循环,睡眠和减少间隔时间,直到达到所述目标截止时间。

此防止了环路从过于频繁醒来(86400 1秒的时间间隔是矫枉过正),但它也可以防止该应用循环从睡眠太长超过目标截止时间。

您可以使定时器与1秒的时间间隔,并且当计时器熄灭,判断是否3:00。

您将需要建立它的服务,以确保其运行,即使有没有人登录到本机,然后有很多不同的方法,以确保触发发生。

考虑将其中System.Timers.Timer设置为Interval和下一3:00之间的差的DateTime.Now

有两种基本的选择这里。

如果你想在现有的服务中做到这一点,你可以使用的定时器的每个晚上3:00触发自己,并运行你的 “任务”。

这就是说,这典型地通过更好处理Windows任务计划程序的。相反,保持应用程序全天候活着的,你只安排它在3:00每天一次运行。


编辑:

如果您需要从代码(在另一个评论中提及)与任务调度工作,这也是可能的。任务计划程序提供了一个 API 设立个别任务( ITask )通过任务调度器( ITaskScheduler )。

不过,鉴于你在XP Embedded的工作,你可能会更好过只用正常的系统配置功能,并设置了一个任务,每天运行一次。在嵌入式系统中,你应该把你的部署过程中足够的控制,以做到这一点。

下面是我们写一个运行计时器每60秒看表服务的简化版本...你可以改变定时器事件经过检查的时间和运行它,然后:

Dim Timer As System.Timers.Timer

Protected Overrides Sub OnStart(ByVal args() As String)
    Timer = New System.Timers.Timer(60000)
    AddHandler Timer.Elapsed, AddressOf timer_Elapsed
    Timer.Start()
End Sub

Protected Overrides Sub OnStop()
    Timer2.Stop()
End Sub

Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
    'Ensure the tick happens in the middle of the minute
    If DateTime.Now.Second < 25 Then
        Timer.Interval = 65000
    ElseIf DateTime.Now.Second > 35 Then
        Timer.Interval = 55000
    ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
        Timer.Interval = 60000
    End If

    'Logic goes here
 End Sub

显然,如果可以的话,使用任务调度像其他人一样在这里提及。它是这样做的首选方式。我正好有这个代码周围铺设,所以我想我会发布它的情况下,它可能对你有所帮助。此外,此代码为我们工作,因为我们从来不知道当外部源将要编辑的表。的间隔设置为一个正确的毫秒数将是这样做的更有效的方式,如通过的md5sum指出。

这个答案可能有点左外野,但我们经常使用 CruiseControl.NET 为我们的一些计划任务。这不是完美的他们,但如果它是你想每天晚上运行,和其他代码一项艰巨的任务/结果依赖于它,然后它是一个不错的选择。您可以安排其运行时,收到电子邮件,如果它的工作/失败。运行其他脚本/代码,如果它不工作,清理在开始之前,你需要的文件后。

而不是所有的情况下的完美解决方案,但它是为那些要求它该死的强大。我们使用它的一些我们的大数据处理工作,并把它发送我们,如果它的工作/失败,甚至会再试一次在30分钟后,如果第一次失败的所有邮件。它给你一个很好的模糊的感觉:)

Windows任务调度程序(如klausbyskov建议)或SQL Server作业。

编辑:

或者,如果你想有一个dyanically分配的时间,你可以创建一个每10分钟投票和执行在所需时间(s)。

一些行动窗口服务

创建在C#在Windows Server是相当琐碎和可以做到这一点。只要确保你有安全和日志记录想通了,因为它可以是相当困难的告诉是怎么回事,而它是(或者不是)上运行。

使用 System.Threading.Timer

我产生线程在ASP.NET应用程序执行预定任务。

这要看你必须提供给您的。

您最好的选择是使用的cron作业的,如果你是在Linux / Unix / Mac OS X中,在Windows任务调度,或 launchd会在Mac OS X的新版本

如果你想在应用程序中做到这一点,你需要一个循环,检查定期和火灾关闭,如果是3点到事件的时间,但这并不理想。

时能够通过命令行以运行该程序?如果是这样,创建一个foo.bat文件,并打电话给你的程序的命令行(很简单)。

然后使用任务计划以运行在上午03时的每日bat文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top