Fire timer_立即从Windows服务中的OnStart中获取
我正在使用System.Timers.Timer
,我在ac#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.Enabled = true完成相同的工作;
timer = new Timer(); timer.Elapsed += timer_Elapsed; timer.Enabled = true; timer.Interval = 3600000; timer.AutoReset = true;
AutoReset = true将设置一个值,指示每次指定的间隔过去时Timer应该提高Elapsed事件。
使用System.Threading.Timer类而不是System.Timers.Timer,因为此类型只是Threading Timer的包装器。
它也适合您的要求。
System.Threading.Timer timer = new System.Threading.Timer(this.DoWork, this, 0, 36000);
这是细节。
如果你想让你的Timer
立即被触发,那么你只需要在没有指定间隔的情况下初始化Timer
对象(默认为100ms,这几乎是立即: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(); }