从windows服务的OnStart立即触发timer_elapsed
本文关键字:timer elapsed windows 服务 OnStart | 更新日期: 2023-09-27 17:52:46
我使用的是System.Timers.Timer
,并且我在c# windows服务中的OnStart
方法中有如下代码:
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.Start();
这将导致timer_Elapsed
中的代码从我启动服务后的一个小时开始每小时执行一次。有没有办法让它在我启动服务时执行,然后每小时执行一次?
timer_Elapsed
调用的方法运行时间太长,不能直接从OnStart
调用。
启动一个线程池线程来调用worker函数,就像Timer一样。这样的:
timer.Elapsed += timer_Elapsed;
ThreadPool.QueueUserWorkItem((_) => DoWork());
...
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
DoWork();
}
void DoWork() {
// etc...
}
使用System.Timers.Timer的AutoReset属性并将其值设置为"true"。不需要使用timer. start(),因为它和timer做同样的工作。启用= true;
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.AutoReset = true;
AutoReset = true将设置一个值,指示Timer应该在每次指定的间隔时间过后引发Elapsed事件。
如果您想要立即触发Timer
,那么您可以简单地初始化Timer
对象,而不需要指定间隔(它将默认为100ms,几乎是立即:p),然后在调用函数中设置间隔为您喜欢的任何值。下面是我在Windows Service中使用的一个例子:
private static Timer _timer;
protected override void OnStart(string[] args)
{
_timer = new Timer(); //This will set the default interval
_timer.AutoReset = false;
_timer.Elapsed = OnTimer;
_timer.Start();
}
private void OnTimer(object sender, ElapsedEventArgs args)
{
//Do some work here
_timer.Stop();
_timer.Interval = 3600000; //Set your new interval here
_timer.Start();
}
使用System.Threading.Timer类代替System.Timers.Timer,因为这种类型只是Threading Timer的一个包装。
它也符合你的要求。
System.Threading.Timer timer =
new System.Threading.Timer(this.DoWork, this, 0, 36000);
简单。你所要做的就是手动调用事件函数一次。
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.Start();
timer_elapsed();
它毕竟是一个函数。但是,如果您实际上是在创建一个windows服务,并且只希望它每小时触发一次,那么这是错误的方法。
你应该设置一个Windows循环任务。您可以将其配置为立即运行,也可以每小时运行一次。确保你知道你在做什么。我见过它设置不正确,所以它每小时运行一次,但在一天结束时运行两次。更多信息请看这个答案:https://stackoverflow.com/a/4250516/9008140