我的目标是查看Time1和Time2之间是否有任何变化。如果有更改,我需要发送电子邮件并跳过其他检查,然后在另一个时间间隔内发生另一次更改。
这是我第一次创建服务,所以这就是我所做的:
protected override void OnStart(string[] args)
{
DateTime lastUpdate = new DateTime();
lastUpdate = new DateTime(2014, 01, 01, 00, 00, 00);
DateTime curTime = new DateTime();
bool infLoop = true;
while (infLoop)
{
curTime = DateTime.Now;
//define time range1
DateTime startDateMorning = new DateTime(curTime.Year, curTime.Month, curTime.Day, 17, 40, 00);
DateTime endDateMorning = new DateTime(curTime.Year, curTime.Month, curTime.Day, 17, 50, 00);
//define time range2
DateTime startDateEvening = new DateTime(curTime.Year, curTime.Month, curTime.Day, 10, 30, 00);
DateTime endDateEvening = new DateTime(curTime.Year, curTime.Month, curTime.Day, 10, 40, 00);
//time span between last update and current time in iteration
TimeSpan span = curTime - lastUpdate;
//check that we only monitor within interwals, and there was at least 20 minutes delay between last and current check
if (((curTime >= startDateMorning && curTime < endDateMorning)
||
(curTime >= startDateEvening && curTime < endDateEvening))
&& span.Minutes > 20)
{
//connect to DataBase
//get the value
//email warning
//other logic
//set last uopdate as current timestamp
lastUpdate = DateTime.Now;
}
}
}
当我使用sc create Service1 start= auto binPath= "c:\Users\....\program.exe"
并尝试运行它时,我的服务卡住了。所以我必须寻找并手动终止它。我认为我做得不对。
答案 0 :(得分:3)
您需要使用Thread.Sleep()
以避免繁忙等待,或者更好的是,只需使用System.Timers.Timer
(或其中一个表兄弟)就可以在需要时唤醒。您还需要在OnStart()
开始服务,而不是尝试在那里完成所有工作;这意味着调度一个事件处理程序(例如通过Timer
)或启动一个新线程,以便OnStart()
可以在其原始线程上返回。 Windows服务系统仅提供有限的启动时间。 <{1}}也需要实现才能正常关闭。
OnStop()
答案 1 :(得分:1)
&#34;我的服务陷入困境&#34;不太具描述性,但您需要尽快从OnStart返回。您还需要响应其他服务命令,例如OnStop,此代码无法解决,因为它已陷入循环。
在单独的线程中运行您的代码,例如使用Task
。