2011-06-13 213 views
1

我正在构建一个Windows服务,它将根据数据库中的计划对用户进行审计。该服务每十分钟检查一次数据库的计划审计。一旦开始审计,它会在数据库表中标记一个开始时间,以便它在超过10分钟时间内不会再次开始。Windows服务计时器多线程

我的问题是,下面的代码是否可以接受我正在做的事情,并且我应该每次使用多线程10分钟过去,如果是的话,我该如何实现?

我的示例代码:

protected override void OnStart(string[] args) 
{ 
    var aTimer = new Timer(600000); 
    aTimer.Elapsed += ATimerElapsed; 
    aTimer.Interval = 600000; 
    aTimer.Enabled = true; 
    GC.KeepAlive(aTimer); 
} 

private static void ATimerElapsed(object sender, ElapsedEventArgs e) 
{ 
    try 
    { 
     Worker.ProcessScheduledAudits(); 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error); 
    }     
} 

回答

2

System.Threading.Timer将使用线程池中的线程来运行Elapsed处理程序。所以,你已经通过使用定时器来使用多线程了。实际上,所有计时器都使用某种后台线程;他们只是在多线程的方式上有所不同,以便做出最有意义的用途。

如果您需要每十分钟运行一次,但也要确保两个处理程序永远不会同时运行,请尝试在Elapsed方法中设置“CurrentlyRunning”标志,并在执行任何繁重工作之前检查它。

protected override void OnStart(string[] args) 
    { 
     var aTimer = new Timer(600000); 
     aTimer.Elapsed += ATimerElapsed; 
     aTimer.Interval = 600000; 
     aTimer.Enabled = true; 
     GC.KeepAlive(aTimer); 
    } 

    private static currentlyRunning; 

    private static void ATimerElapsed(object sender, ElapsedEventArgs e) 
    { 
     if(currentlyRunning) return; 
     currentlyRunning = true; 
     try 
     { 
      Worker.ProcessScheduledAudits(); 
     } 
     catch (Exception ex) 
     { 
      EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error); 
     } 
     currentlyRunning = false; 
    } 

从理论上讲,这可以比赛,但你只踢了一个线程此事件每10分钟的几率是非常不可能的。

+0

你是什么意思的种族?顺便提一下,我喜欢这个解决方案。 – Cyberdrew 2011-06-13 20:01:19

+1

“比赛”我的意思是说,几乎同时运行这个方法的两个线程都可以检查当前的运行情况,并在其中一个线程有机会将其设置为true之前看到它是假的。然后这两个线程将并行进入方法的肉,这是你不想要的。多用户或多线程系统中的这些类型的错误通常称为“竞争条件”。但是,因为您使用的定时器只会每10分钟启动一次该方法,所以除非使用定时器之外的其他机制调用此方法,否则不必担心。 – KeithS 2011-06-13 21:07:15

+0

感谢您的好评! – Cyberdrew 2011-06-14 13:00:47

1

此代码已经 “使用多线程”。假设Timer实例为System.Timers.Timer,则Elapsed处理程序将在线程池线程上运行。

如果这不是您想要的,您可以使用SynchronizingObject属性来修改调度行为。欲了解更多详情,请阅读the MSDN documentation

+0

感谢您澄清定时器实例。 – Cyberdrew 2011-06-13 20:01:40