2 回答
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任务可能会给你所有你需要的。
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 小时滴答一次并删除当前计划,并使用数据库中的当前值进行更新。但是你想如何做到这一点当然取决于你的具体情况。
- 2 回答
- 0 关注
- 471 浏览
添加回答
举报