如果我有一个 Windows 服务需要每 30 秒执行一次任务,那么最好使用它; Timer() 类或执行任务的循环然后休眠几秒?
class MessageReceiver
{
public MessageReceiver()
{
}
public void CommencePolling()
{
while (true)
{
try
{
this.ExecuteTask();
System.Threading.Thread.Sleep(30000);
}
catch (Exception)
{
// log the exception
}
}
}
public void ExecutedTask()
{
// do stuff
}
}
class MessageReceiver
{
public MessageReceiver()
{
}
public void CommencePolling()
{
var timer = new Timer()
{
AutoReset = true,
Interval = 30000,
Enabled = true
};
timer.Elapsed += Timer_Tick;
}
public void Timer_Tick(object sender, ElapsedEventArgs args)
{
try
{
// do stuff
}
catch (Exception)
{
// log the exception
}
}
}
Windows 服务将创建 MessageReciever 类的实例,并在新线程上执行 CommencePolling 方法。
最佳答案
我认为这实际上取决于您的要求。
案例 1。
假设你想运行this.ExecuteTask()
从 12:00AM(即 12:00、12:05...)开始每五分钟执行一次,并假设执行时间为 this.ExecuteTask()
各不相同(例如,从 30 秒到 2 分钟),也许使用计时器而不是 Thread.Sleep() 似乎是一种更简单的方法(至少对我来说)。
但是,您可以使用 Thread.Sleep()
来实现此行为还可以通过计算偏移量,同时在线程唤醒和完成 this.ExecuteTask()
时获取时间戳。 。
情况 2。
假设您想在 this.ExecuteTask()
完成后的接下来 5 分钟内执行该任务,使用Thread.Sleep()
似乎更容易。同样,您也可以使用计时器来实现此行为,方法是每次重置计时器,同时计算每次 this.ExecuteTask()
的偏移量。完成。
注意1,对于情况1,在以下情况下应该非常小心:What if this.ExecuteTask()
有时需要的时间超过该时间段(即,在上面的示例中,它从 12:05 开始,到 12:13 结束)。
这对您的申请意味着什么?将如何处理?
a.完全失败 - 中止服务或在 12:10 中止当前(12:05)执行并启动 12:10 执行。
b.没什么大不了的(跳过 12:10 一个并在 12:15 运行this.ExecuteTask()
)。c.没什么大不了的,但是需要在 12:05 任务完成后立即启动 12:10 执行(如果持续花费超过 5 分钟怎么办??)。
d.即使 12:05 执行当前正在运行,也需要启动 12:10 执行。
e.还有什么吗?
对于您在上面选择的策略,您选择的实现(计时器或
Thread.Sleep()
)是否易于支持您的策略?
注释2。您可以在 .NET 中使用多种计时器。请参阅以下文档(尽管它有点陈旧,但似乎是一个好的开始):Comparing the Timer Classes in the .NET Framework Class Library
关于c# - Windows服务定时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1102247/