我正在构建一个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);
}
}
答案 0 :(得分:2)
System.Threading.Timer将使用Threadpool中的线程来运行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分钟只为这个事件开辟一个线程,所以几乎不可能。
答案 1 :(得分:1)
此代码 “使用多线程”。假设您的Timer
实例是System.Timers.Timer
,您的Elapsed
处理程序将在线程池线程上运行。
如果这不是您想要的,您可以使用SynchronizingObject
属性来修改调度行为。有关详细信息,请阅读the MSDN documentation。