2

对于一个工作项目,我正在执行一项任务,我将创建一个 24/7 运行的 C#.NET Windows 服务。该程序基本上将简单地在不同位置之间移动文件(基于给定路径和正则表达式) - 从/到 HTTP、网络路径和 FTP。管理员将通过 ASP.NET 中的管理页面安排这些作业,所有作业都将存储在数据库中。看起来最难的部分是调度这些作业——将任务安排在某一天的某一特定时间运行是非常简单的,但它还需要足够健壮,以允许任务每天、每个工作日、每个特定天运行每月一次,甚至每隔几秒/分钟。我得出的结论是,存储此调度信息的最简单方法是在数据库中使用 cron 语法 (http://adminschoice.com/crontab-quick-reference)。

该应用程序有一个计时器每 10 分钟检查一次数据库的更改,但我遇到的主要问题是检索要执行的任务 - 我想一个选择是简单地每 10 分钟检索一次所有内容,并检查每一行看看他们是否应该被执行。但我觉得这是一种非常低效且技术上很懒惰的方式——你们会怎么做呢?

我知道 Windows 计划任务会是一种更简单的方法,但似乎我的老板不希望这样。

提前感谢任何可以提供一些提示/建议的人。

4

2 回答 2

0

如果您必须跟踪的任务数量不是很大,您可以在内存中维护所有任务的优先级队列。节点将包含记录键(来自数据库)和计算的下一次更新日期/时间。

当程序启动时,从数据库中读取每条记录并构建您的优先级队列。构建队列后,查看第一项的日期并设置一个计时器以在该时间唤醒。当计时器唤醒时,执行当前到期的所有任务,将它们重新安排到下一个更新日期/时间,找到下一个需要更新的项目并设置一个计时器以在该时间到来时唤醒。

要处理修改,您也可以让 Web 应用程序修改内容以通知您的服务。您必须取消现有的计时器并重新安排,但您不必读取整个数据库,除非在启动时。

也就是说,我同意@Oded:说服你的老板使用 Windows 计划任务。如果他不喜欢该界面,您可以让您的 Web 应用程序(或 Web 应用程序与之通信的服务)与 Windows 任务计划程序 API 对话。Codeplex 有一个包装器: http: //taskscheduler.codeplex.com/

于 2010-09-27T22:35:52.510 回答
0

看看Quartz.NET - 几乎完全符合您的要求。您也可以使用Cron 表达式来安排它。

如果您在数据库中存储了有关每个作业的足够信息,您将能够在每次服务启动时创建一个作业。您可以定期轮询更改并更新作业的规则。

在 Windows 服务中托管它是一个很好的方法 - 允许您监视它的运行并提供标准机制以在它崩溃时重新启动它(net start xxx)等。比计划任务好得多。

于 2010-09-27T22:41:14.347 回答