Windows服务计时器多线程

时间:2011-06-13 19:42:36

标签: c# multithreading windows-services

我正在构建一个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 个答案:

答案 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