如何在同一时间每天一次在c#服务中执行代码?

时间:2009-09-03 13:06:18

标签: c# service multithreading scheduling

所以这是我的问题,我需要在服务器上运行一个c#服务,该服务器每天凌晨3点在ftp上获取文件一次。我认为我可以使用thread.sleep()或者将DateTime.Now与凌晨3点进行比较....

你有更好的解决方案吗?

非常感谢你的帮助!

8 个答案:

答案 0 :(得分:36)

更好的解决方案,让Windows使用Scheduled Tasks为您完成。

如果它只需要每天执行一次,那么我会为此而努力。即使谷歌也这样做;)

编辑:

要回答评论,就像Fredrik所说的那样。它是一个高级选项,您可以在设置任务时打开它,其中包含一个名为“Run only if logged on”的复选框,开头时为false。

答案 1 :(得分:4)

编写一个控制台应用程序或同等程序,并使用Windows Scheduler(或现在称之为的任何东西......)每天运行它。

答案 2 :(得分:3)

对于灵活的解决方案,您可以使用this。它不是Windows服务,但您可以轻松地将其合并为一个。或者您可能会认为Quartz.NET被认为是工业实力(Java版本肯定是)。

答案 3 :(得分:3)

我已成功使用预定任务进行备份,但我有一点需要注意......

如果您注销,则不会执行计划任务。我不确定这是否可以被覆盖,但我已经被未执行的任务所困扰,因为Windows会自动更新,重新启动并等待我登录。

我禁用了自动更新 - Windows首先应该是ASK。

另一个考虑因素是3AM是许多用户通常会被注销的时间。

答案 4 :(得分:2)

其他答案都很好。我只是想我会指出

  

将DateTime.Now与凌晨3点进行比较

是一个糟糕的解决方案,即使你在每次检查之间睡了一段时间,因为它不必要地浪费系统资源(不仅在重复检查时间,而且还在程序的内存使用中)。

答案 5 :(得分:2)

如果你每天晚上都在期待一个文件,而不是担心它什么时候到来,那么只要事件发生就会被触发。

看看:

System.IO.FileSystemWatcher

File System Watcher on MSDN

答案 6 :(得分:1)

System.Threading.Timer可能适合您。

Documented here

答案 7 :(得分:1)

为什么不将其设置为作为计划任务运行。让它执行然后退出。设置Windows以在每天凌晨3:00将计划任务作为计划任务启动。