我正在创建一个Windows服务,它检查文件夹,其他服务等。如果其中任何一个出现故障,则发送警报文本消息。但是,我对在给定的时间段内(从23.00从晚到早上07.00)收到警报信息不感兴趣。
该服务是通过XML配置文件设置的,可以预定义这段时间。
我需要一种方法来检查服务是否在一段时间内运行,因此它会暂停短信。该服务每5分钟检查一次这段时间,因此在这些检查期间我无法弄清楚如何应对轮班时间。
详细说明:
我目前的代码:
bool silende = false;
DateTime silenceModeFrom = new DateTime(
DateTime.Now.Year,
DateTime.Now.Month,
DateTime.Now.Day,
int.Parse(doc.XPathSelectElement(
"//SurveilanceServiceConfig/SilenceModeTimeFrom").Value),
00,
00);
DateTime silenceModeTo = silenceModeFrom.AddHours(
int.Parse(doc.XPathSelectElement(
"//SurveilanceServiceConfig/SilenceModeTimeHours").Value));
if (DateTime.Now > silenceModeFrom && DateTime.Now < silenceModeTo)
{
silence = true;
}
在此代码中,如果在24.00之前进行检查,但在DateTime.Now.Day
等之后,则检查将在第二天进行。所以从理论上讲,代码只能将静默期验证为每天23.00到24.00。
答案 0 :(得分:2)
你离这么远......
您的代码存在轻微的问题,每次调用DateTime.Now
时间都会发生变化 - 您需要捕获实例触发服务的时间即
var instant = DateTime.Now;
DateTime silenceModeFrom = new DateTime(instant.Year, instant.Month, instant.Day, int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeFrom").Value), 00, 00);
DateTime silenceModeTo = silenceModeFrom.AddHours(int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeHours").Value));
bool silence = instant.TimeOfDay >= silenceModeFrom.TimeOfDay && instant <= silenceModeTo;
但是,查看此代码,您的时间窗口显示错误。你对这里的Date
并不感兴趣 - 这真的只是时间。因此,23:00-07:00之间的任何事情都被认为是“沉默”时期,即
int curHour = DateTime.Now.Hour;
int silenceStartHour = int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeFrom").Value);
int silenceEndHour = int.Parse(doc.XPathSelectElement("//SurveilanceServiceConfig/SilenceModeTimeHours").Value);
bool silence = curHour > silenceStartHour || curHour < silenceEndHour;
可以略微改善确定您是否处于静默期的逻辑,以考虑一天内的全部范围或午夜时分的范围。
bool silence = silenceStartHour <= silenceEndHour
? (curHour >= silenceStartHour && curHour < silenceEndHour)
: (curHour >= silenceStartHour || curHour < silenceEndHour);