我正在使用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
调用它。
答案 0 :(得分:19)
只需启动一个线程池线程来调用worker函数,就像Timer一样。像这样:
timer.Elapsed += timer_Elapsed;
ThreadPool.QueueUserWorkItem((_) => DoWork());
...
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
DoWork();
}
void DoWork() {
// etc...
}
答案 1 :(得分:2)
使用System.Timers.Timer的AutoReset属性并将其值设置为“true”。 无需使用timer.Start(),因为它与timer.Enabled = true;
执行相同的工作timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Enabled = true;
timer.Interval = 3600000;
timer.AutoReset = true;
AutoReset = true将设置一个值,表示每当指定的间隔过去时,Timer应该提升Elapsed事件。
答案 2 :(得分:1)
使用System.Threading.Timer类而不是System.Timers.Timer,因为此类型只是线程计时器的包装器。
它也符合您的要求。
System.Threading.Timer timer =
new System.Threading.Timer(this.DoWork, this, 0, 36000);
Here是详细信息。
答案 3 :(得分:0)
如果您希望立即触发Timer
,那么您只需在没有指定间隔的情况下初始化Timer
对象(默认为100毫秒,几乎立即:P),然后设置被调用函数内的间隔,无论你喜欢什么。以下是我在Windows服务中使用的示例:
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();
}