我正在构建一个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);
}
}
你是什么意思的种族?顺便提一下,我喜欢这个解决方案。 – Cyberdrew 2011-06-13 20:01:19
“比赛”我的意思是说,几乎同时运行这个方法的两个线程都可以检查当前的运行情况,并在其中一个线程有机会将其设置为true之前看到它是假的。然后这两个线程将并行进入方法的肉,这是你不想要的。多用户或多线程系统中的这些类型的错误通常称为“竞争条件”。但是,因为您使用的定时器只会每10分钟启动一次该方法,所以除非使用定时器之外的其他机制调用此方法,否则不必担心。 – KeithS 2011-06-13 21:07:15
感谢您的好评! – Cyberdrew 2011-06-14 13:00:47