C# Windows服务计划执行
如果我有一个Windows服务,需要每30秒执行一个任务,这是更好的使用;Timer()类或执行任务的循环会休眠几秒钟C# Windows服务计划执行,c#,windows-services,C#,Windows Services,如果我有一个Windows服务,需要每30秒执行一个任务,这是更好的使用;Timer()类或执行任务的循环会休眠几秒钟 class MessageReceiver { public MessageReceiver() { } public void CommencePolling() { while (true) { try { this.
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服务将创建MessageReceiver类的实例,并在新线程上执行CommenteColling方法。在这十秒钟的等待期间,您还做了什么?使用Thread.sleep会阻止您执行其他操作。从性能的角度来看,我认为您不会看到太多的差异,但我会避免自己使用Thread.sleep
有三种计时器可供选择-System.Windows.Forms.Timer在主线程上实现,而System.Timer.Timer和System.Threading.Timer则创建单独的线程。我相信这两种方法是等效的。无论哪种方式,都会有一个线程:要么因为您创建了一个线程,要么因为实现Timer类的库创建了一个线程
在资源方面,使用Timer类可能会稍微便宜一些,因为实现计时器的线程可能也会监视其他超时。我想这些答案会有所帮助。我没有回答,但是John Saunders(上图)。。。答案可以在这里找到我想这取决于你的要求 案例1. 假设您想从12:00AM开始每五分钟运行一次
this.ExecuteTask()
,并假设this.ExecuteTask()
的执行时间不同(例如,从30秒到2分钟),可能使用计时器而不是线程。Sleep()似乎是一种更简单的方法(至少对我来说)
但是,您也可以使用Thread.Sleep()
实现此行为,方法是在线程唤醒和完成this.ExecuteTask()
时计算偏移量
案例2.
假设您想在完成this.ExecuteTask()
之后的5分钟内执行任务,使用线程.Sleep()
似乎更容易。同样,您也可以使用计时器实现此行为,方法是在每次this.ExecuteTask()
完成时计算偏移量时重置计时器
注意1,对于案例1,您在以下场景中应该非常小心:如果此.ExecuteTask()
有时花费的时间超过时间段(即,在上面的示例中,它从12:05开始,到12:13结束)
B没什么大不了的(跳过12:10,在12:15运行
this.ExecuteTask()
)
c。没什么大不了的,但需要在12:05任务完成后立即启动12:10执行(如果持续超过5分钟呢??)
d。需要启动12:10执行,即使当前正在运行12:05执行
e。还有别的吗Thread.Sleep()
)是否容易支持您的策略注2。在.NET中可以使用几个计时器。请参阅以下文档(尽管有点过时,但这似乎是一个好的开始):看起来像的副本,我通过搜索“服务计时器”找到了它。@John谢谢。我尝试搜索“Windows服务计时器”,但找不到任何内容。干杯