如果我的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方法。
答案 0 :(得分:4)
我认为这实际上取决于您的要求。
案例1。
假设您想要从上午12:00开始每隔五分钟运行一次this.ExecuteTask()
(即,12:00,12:05,...),并假设this.ExecuteTask()
的执行时间不同(例如,来自30秒到2分钟),也许使用计时器而不是Thread.Sleep()似乎是一种更简单的方法(至少对我而言)。
但是,您可以使用Thread.Sleep()
来实现此行为,同时通过计算线程唤醒时和this.ExecuteTask()
完成时的时间戳来计算偏移量。
案例2。
假设您想在完成this.ExecuteTask()
后的5分钟内执行任务,使用Thread.Sleep()
似乎更容易。同样,您可以通过计时器以及每次this.ExecuteTask()
完成时计算偏移量时每次重置计时器来实现此行为。
注1 ,对于案例1,您应该在以下场景中非常小心:如果this.ExecuteTask()
有时需要超过期限(即从12:05开始并完成),该怎么办?上例中的12:13)。
这对您的应用程序意味着什么以及如何处理?
一个。完全失败 - 中止服务或在12:10中止当前(12:05)并执行12:10执行。
湾没什么大不了的(跳过12:10并在12:15运行this.ExecuteTask()
)。
℃。没什么大不了的,但需要在12:05任务完成后立即执行12:10执行(如果它持续超过5分钟怎么办?)。
d。即使当前正在执行12:05执行,也需要启动12:10执行。
即其他什么?
对于您在上面选择的政策,您选择的实施(计时器或Thread.Sleep()
)是否易于支持您的政策?
<强>注2 即可。您可以在.NET中使用多个计时器。请参阅以下文档(即使它有点老化,但似乎是一个好的开始):Comparing the Timer Classes in the .NET Framework Class Library
答案 1 :(得分:0)
你在十秒钟的等待期间还在做什么吗?使用Thread.sleep会阻止,阻止你做其他事情。从性能的角度来看,我认为你没有看到太大的区别,但我会避免自己使用Thread.sleep。
有三个计时器可供选择 - System.Windows.Forms.Timer在主线程上实现,而System.Timers.Timer和System.Threading.Timer正在创建单独的线程。
答案 2 :(得分:0)
我相信这两种方法都是等价的。将有一个线程:要么是因为你创建了一个,要么是因为实现Timer类的库创建了一个。
使用Timer类可能在资源方面稍微便宜一些,因为实现计时器的线程也可能监视其他超时。
答案 3 :(得分:0)
我知道this question的答案会有所帮助。
答案 4 :(得分:0)
我没有回答,但约翰桑德斯(上图)......答案可以在这里找到For a windows service, which is better, a wait-spin or a timer?