为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
LEATH 2021-11-07 20:13:04
好的,所以我需要构建仅在特定时间运行的 ac# 任务,时间将来自 SQL 数据库,并且每天可能超过 1 次。例如,c# 任务需要在 6:00、13:00、15:00 和 19:00 运行。同时它会睡觉。我正在考虑只做 Task.delay(60000) 并检查然后在时间循环上运行并检查 DateTime.Now < 时间。但这似乎会使我的计算机过载,不是吗?我无法使用 Windows 管理器,因为我的任务是在执行其他任务的 Windows 服务上。做这种工作的最佳方式是什么?PS:任务工作是获取 api 并将信息获取到数据库中。非常感谢您的帮助!
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您可以使用任务计划程序Windows


任务计划程序可用于执行任务,例如启动应用程序、发送电子邮件或显示消息框。可以安排任务执行:


在特定时间。


在每日计划的特定时间。


你可以试试这个为每一天动态创建一个任务,


   using System;

   using Microsoft.Win32.TaskScheduler;

   static void Main(string[] args)

   {

      // Get the service on the local machine

      using (TaskService ts = new TaskService())

      {

         // Create a new task definition and assign properties

         TaskDefinition td = ts.NewTask();

         td.RegistrationInfo.Description = "Does something";


         // Create a trigger that will fire the task at this time every other day

         td.Triggers.Add(new DailyTrigger { DaysInterval = 2 });


         // Create an action that will launch your application whenever the trigger fires

         td.Actions.Add(new ExecAction("my_application.exe", "c:\\test.log", null));


         // Register the task in the root folder

         ts.RootFolder.RegisterTaskDefinition(@"Test", td);


         // Remove the task we just created

         ts.RootFolder.DeleteTask("Test");

      }

   }

你编写你my_application.exe的连接 API 和拉到数据库。接下来,配置创建的任务以调用您的应用程序。


Quartz也是一个选项,具有更丰富的 API 来创建任务并将其保存到数据库。但我认为Windows Scheduled任务可能会给你所有你需要的。


查看完整回答
反对 回复 2021-11-07
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

你应该看看 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 UTC

List<DateTime> times = this.database.GetSchedule();


// Loop the times and schedule jobs

foreach(var time in times) 

{

   var timeUntilJob = time - DateTime.UtcNow;

   var jobId = BackgroundJob.Enqueue(() => YourMethodToDoWork(), timeUntilJob);


   // You will need to somehow store the job ids, in case you want to 

   // cancel an execution scheduled for a later time (e.g. if you

   // need to update it if the database-stored schedule changes).

   // You could then invoke BackgroundJob.Delete(jobId)

 }

Hangfire 可以将预定的调用存储在 SQL Server 数据库(或 Redis 或 MongoDb 等)中。它创建包含要在预定时间调用的程序集、方法和参数的记录。这意味着即使您的服务出现故障,您也不会丢失任务的执行。


您可以创建一个计时器,每 X 小时滴答一次并删除当前计划,并使用数据库中的当前值进行更新。但是你想如何做到这一点当然取决于你的具体情况。


查看完整回答
反对 回复 2021-11-07
  • 2 回答
  • 0 关注
  • 471 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信