c# - C# 中数据库驱动的 'scheduled tasks' 应用程序 - 需要一些重新 cron 语法的建议

标签 c# sql cron

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

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

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

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

最佳答案

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

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

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

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

关于c# - C# 中数据库驱动的 'scheduled tasks' 应用程序 - 需要一些重新 cron 语法的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807849/

相关文章:

c# - 扩展方法解析 IQueryable 与 IEnumerable

c# - Gembox 电子表格 C# : It is a way to detect if a cell has border?

sql - 一条语句中包含所有名称的查询表

bash - 如何在没有交互式编辑器的情况下自动使用 Bash 创建一个 cron 作业?

c# - 发布后应用设置

c# - 使用 ffmpeg 和正则表达式获取 'creation_time' 的视频

mysql - 导入schema.sql时出错

sql - 当匹配的行存在于另一个表中时更新行

java - 如何保护 GAE 灵活环境上的 google cron 服务任务?

java - 跨多个操作系统删除一个文件