gpt4 book ai didi

c# - 在 Windows 服务内按计划运行方法

转载 作者:行者123 更新时间:2023-11-30 22:16:20 26 4
gpt4 key购买 nike

我有一个 Windows 服务,我需要在特定的计划中运行一个方法。到目前为止,我实现了一个表示时间表的类。

public class SchaduleTime
{
public int Hour { get; set; }

public int Minute { get; set; }

public DateTime Next
{
get
{
var now = DateTime.Now;
var dt = now.Date;

// the time has passed to execute today?
if (Hour * 60 + Minute < now.Hour * 60 + now.Minute)
{
dt = dt.AddDays(1);
}

return new DateTime(dt.Year, dt.Month, dt.Day, Hour, Minute, 0);
}
}
}

然后我创建了一个包含这些字段的主类:

System.Timers.Timer timer;
private SchaduleTime[] schadules;

然后在计时器字段的 Elapsed 事件中运行类似的东西:

private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// do my work.

// programing next:
var nowTicks = DateTime.Now.Ticks;

// get the next schadule.
var next = schadules
.Select(s => new
{
Schadule = s,
IntervalNeeded = s.Next.Ticks - nowTicks
})
.OrderBy(o => o.IntervalNeeded)
.First();

timer.Enabled = false;
timer.Stop();

timer.Interval = (int) new TimeSpan(next.IntervalNeeded).TotalMilliseconds;

timer.Enabled = true;
timer.Start();
}

对我来说,这似乎是一种拼凑策略或意大利面条代码,我的意思是看起来很丑。

有没有一种方法可以使用与调度一起工作的专用类或类似 .net 中的 Windows Task Scheduler 之类的东西来做到这一点,或者我的方法很好但我吓坏了?

最佳答案

让我们考虑一下您在 14:00 有 10 个时间表的假设情况。假设你的计时器在 13:59:59 停止,会发生什么:

  • 10 个时间表声称他们还有 1 秒的时间
  • elapsed 处理程序首先选择并以 1 秒的间隔重新启动
  • 它在 14:00 再次停止 - 就在所有时间表都已经返回第二天的 Next

因此,您完成了 10 个作业中的 1 个。看起来不太好。

当然,你可以采取列表,或者限制在给定的小时内只能设置 1 个作业。但话又说回来,您还需要做出哪些其他假设? schedules 数组可以为空吗?当有 100 万个时间表时它是否有效?你有这个代码的测试吗?等等。

相反,您可以使用专门的库来做到这一点 - Quartz .这是一个简单的作业调度程序,它肯定可以执行您要在此处实现的操作:

ISchedulerFactory factory= new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();

// You'll have to implement class performing actual work to be done - ServiceJob
JobDetail jobDetail = new JobDetail("ServiceJob", null, typeof(ServiceJob));
Trigger trigger = TriggerUtils.MakeDailyTrigger();
// Start time could be anytime today
trigger.StartTimeUtc = DateTime.UtcNow;
trigger.Name = "ServiceTrigger";
scheduler.ScheduleJob(jobDetail, trigger);

Quartz 负责所有的计时器,在请求的时间运行指定的作业等等。很简单,有一套很好的 tutorials好吧 - 您不必执行任何操作。

关于c# - 在 Windows 服务内按计划运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com