这怎么做得最好?我希望在服务器上运行的应用程序每晚03:00触发一个事件。
答案 0 :(得分:23)
使用Windows任务计划程序
答案 1 :(得分:3)
如果您想在运行应用程序代码(而不是使用任务计划程序)中执行此操作,则应选择一个持续时间让您的应用程序睡眠时间相当长(例如,1小时或3,600秒)。您的应用程序循环,并且当每个睡眠呼叫到期时,应用程序会定期检查截止时间(03:00)之前剩余的时间。一旦剩余的睡眠时间低于粗略的间隔时间,它应该减少到更短的间隔(每次减半,或减少到10秒)。继续循环,休眠并缩短间隔时间,直到达到目标截止时间。
这可以防止循环过于频繁地唤醒(86,400 1秒间隔是过度杀伤),但它也可以防止应用程序循环因睡眠时间过长而超出目标截止时间。
答案 2 :(得分:1)
你可以制作一个间隔为1秒的计时器,当计时器熄灭时,检查它是否是3点。
答案 3 :(得分:1)
这里有两个基本选项。
如果您尝试在现有服务中执行此操作,则可以使用Timer在每晚3:00触发自己,然后运行“任务”。
话虽如此,通常可以通过Windows Task Scheduler更好地处理。您可以将其安排为每天凌晨3点运行一次,而不是让应用程序保持全天候运行。
编辑:
如果您需要使用代码中的任务计划程序(在另一个评论中提到),那也是可能的。任务计划程序提供API,用于通过任务计划程序(ITask)设置各个任务(ITaskScheduler)。
但是,鉴于您正在使用XP Embedded,您可能最好只使用正常的系统配置功能,并设置每天运行一次的任务。在嵌入式系统中,您应该在部署期间有足够的控制权来执行此操作。
答案 4 :(得分:1)
您需要在服务中构建它,以确保即使没有人登录到计算机也能运行它,然后有很多不同的方法来确保触发发生。
考虑制作一个System.Timers.Timer
,其中Interval
设置为DateTime.Now
与下一个3:00之间的差异。
答案 5 :(得分:1)
以下是我们编写的服务的简化版本,该服务每隔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所指出的那样,将间隔设置为正确的毫秒数将是一种更有效的方法。
答案 6 :(得分:1)
这个答案可能有点遗留,但我们经常使用CruiseControl.NET来完成一些计划任务。对于他们所有人来说并不是完美的,但是如果你想要每晚运行并且其他代码/结果取决于它是一项大工作那么它是一个不错的选择。您可以安排它随时运行,如果工作/失败,请收到电子邮件。运行其他脚本/代码(如果它不起作用),在开始之前和之后清理所需的文件。
并非所有情况的完美解决方案,但对于那些需要它的人来说,它是非常强大的。我们将它用于我们的一些大数据处理工作,如果它工作/失败,它会向我们发送所有电子邮件,如果第一次失败,它甚至会在30分钟后再次尝试。它给你一个很好的模糊感觉:))
答案 7 :(得分:0)
Windows任务计划程序(由klausbyskov建议)或SQL Server作业。
编辑:
或者如果你想要一个dyanically指定的时间,你可以创建一个每10分钟轮询一次的Windows服务,并在所需的时间执行一些操作。
答案 8 :(得分:0)
这取决于您可以使用的内容。
您最好的选择是使用cron作业,如果您使用的是Linux / Unix / Mac OS X,Windows上的任务调度程序,或者{* 3}}则适用于较新版本的Mac OS X. / p>
如果你想在一个应用程序中执行此操作,你需要一个定期检查时间的循环,如果它是03:00则触发该事件,但这并不理想。
答案 9 :(得分:0)
Creating a windows server in C#相当简单,可以做到这一点。只要确保你已经找到了安全性和日志记录,因为在它运行(或不运行)的时候很难分辨出发生了什么。
答案 10 :(得分:0)
我在ASP.NET应用程序中生成一个线程来执行计划任务。
答案 11 :(得分:0)
程序是否能够通过命令行运行?如果是这样,创建一个foo.bat文件,并调用您的程序命令行(非常简单)。
然后使用Task Scheduler每天凌晨3点运行.bat文件。