我正在尝试为我的程序添加一个功能,该功能将在芝加哥期货市场关闭后每天执行代码。这意味着我想在东部时间5:35左右(市场所在的中心时间4:35)运行代码。随着夏令时间的发生,这当然会在EST(UTC -5)和EST(UTC -4)之间来回切换。如何在特定时间每天执行代码?
我知道有很多类似的问题,但是他们都没有提供我可以使用的解决方案。主要建议似乎是使用任务计划程序或Quartz,但是,我无法在我的程序中实施这些建议。我认为最有希望的解决方案是使用TimeZoneInfo
,DateTime
和TimeSpan
的组合来安排每天在正确的时间触发的计时器。该解决方案我现在有是这样的:
DateTime now = DateTime.Now;
DateTime currentDateTime = now.DateTime.Date;
DateTime expiryDateTime = currentDateTime
.AddHours(17)
.AddMinutes(35)
.AddDays(
now.DateTime.Hour >= 18 + utcOffset
|| (now.DateTime.Hour == 17 && now.DateTime.Minute >= 35) ? 1 : 0);
Timer timer = new Timer(
...,
null,
expiryDateTime - DateTime.Now,
...);
我想这这将土崩瓦解,但是,如果我的代码是不是东部时间以外的时间区域中运行。我还担心这种情况在时区从EST切换到EDT时的23或25小时内不会正常工作,反之亦然。
有没有比我目前正在处理调度更好的方法?我怎样才能让这段代码更健壮,可以处理在任何时区运行,但始终在东部时间执行?如上所述,任务计划程序和Quartz不是选项。石英出来了,因为我无法包含第三方库。任务计划程序已经关闭,因为我需要从我的程序中访问很多内部值。启动另一个应用程序并将这些值公开给该应用程序增加了比我认为的更好的复杂性。
'主要的建议似乎是使用任务计划程序或然而,Quartz,我无法在我的程序中实现这些。“,请问为什么?是否因为没有足够的文档来满足您的需求? **更具体地说,为什么不能使用Quartz?** –
只需将所有程序状态存储在配置文件或数据库中,以便任务调度程序不需要将其传入或知道任何事情。 – Servy
我同意服务。此外,可能的代码异味,因为即使你需要通过DB,你应该有一个可重用的DL,所以事情保持简单。 –