C# 任务仅在时间合适时运行 - 在特定时间

好的,所以我需要构建仅在特定时间运行的 ac# 任务,时间将来自 SQL 数据库,并且每天可能超过 1 次。

例如,c# 任务需要在 6:00、13:00、15:00 和 19:00 运行。同时它会睡觉。

我正在考虑只做 Task.delay(60000) 并检查然后在时间循环上运行并检查 DateTime.Now < 时间。

但这似乎会使我的计算机过载,不是吗?我无法使用 Windows 管理器,因为我的任务是在执行其他任务的 Windows 服务上。

做这种工作的最佳方式是什么?

PS:任务工作是获取 api 并将信息获取到数据库中。

非常感谢您的帮助!


LEATH
浏览 472回答 2
2回答

幕布斯7119047

您可以使用任务计划程序Windows任务计划程序可用于执行任务,例如启动应用程序、发送电子邮件或显示消息框。可以安排任务执行:在特定时间。在每日计划的特定时间。你可以试试这个为每一天动态创建一个任务,&nbsp; &nbsp;using System;&nbsp; &nbsp;using Microsoft.Win32.TaskScheduler;&nbsp; &nbsp;static void Main(string[] args)&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; // Get the service on the local machine&nbsp; &nbsp; &nbsp; using (TaskService ts = new TaskService())&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Create a new task definition and assign properties&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TaskDefinition td = ts.NewTask();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;td.RegistrationInfo.Description = "Does something";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Create a trigger that will fire the task at this time every other day&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;td.Triggers.Add(new DailyTrigger { DaysInterval = 2 });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Create an action that will launch your application whenever the trigger fires&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;td.Actions.Add(new ExecAction("my_application.exe", "c:\\test.log", null));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Register the task in the root folder&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ts.RootFolder.RegisterTaskDefinition(@"Test", td);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Remove the task we just created&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ts.RootFolder.DeleteTask("Test");&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;}你编写你my_application.exe的连接 API 和拉到数据库。接下来,配置创建的任务以调用您的应用程序。Quartz也是一个选项,具有更丰富的 API 来创建任务并将其保存到数据库。但我认为Windows Scheduled任务可能会给你所有你需要的。

吃鸡游戏

你应该看看 Quartz .NET:https://www.quartz-scheduler.net/如果我理解正确,它将从 SQL 数据库中获取它需要运行的时间,因此您的 Windows 服务可能应该每隔一段时间检查一次,是否已更新计划并在应用程序中重新计划(如果相关)。另一个非常好的项目是 Hangfire:https://www.hangfire.io/任何一个都可能允许您做您需要的事情。这是您可以执行的操作的示例(在 Hangfire 中):// Get database times. For simplicity I'll assume that you// just get a list of dates. Assume they're stored in in UTCList<DateTime> times = this.database.GetSchedule();// Loop the times and schedule jobsforeach(var time in times)&nbsp;{&nbsp; &nbsp;var timeUntilJob = time - DateTime.UtcNow;&nbsp; &nbsp;var jobId = BackgroundJob.Enqueue(() => YourMethodToDoWork(), timeUntilJob);&nbsp; &nbsp;// You will need to somehow store the job ids, in case you want to&nbsp;&nbsp; &nbsp;// cancel an execution scheduled for a later time (e.g. if you&nbsp; &nbsp;// need to update it if the database-stored schedule changes).&nbsp; &nbsp;// You could then invoke BackgroundJob.Delete(jobId)&nbsp;}Hangfire 可以将预定的调用存储在 SQL Server 数据库(或 Redis 或 MongoDb 等)中。它创建包含要在预定时间调用的程序集、方法和参数的记录。这意味着即使您的服务出现故障,您也不会丢失任务的执行。您可以创建一个计时器,每 X 小时滴答一次并删除当前计划,并使用数据库中的当前值进行更新。但是你想如何做到这一点当然取决于你的具体情况。
打开App,查看更多内容
随时随地看视频慕课网APP