Windows服务与计时器25秒后

时间:2013-11-12 14:54:17

标签: c# .net windows service timer

我有这个简单的Windows服务,它是浏览器游戏的一部分。它的作用是检查数据库,如果需要,更新一些行。这些操作大约需要0.5到1秒。

它读取的数据是一个告诉项目是否应该更新的日期。

它完美无缺,但总是晚了大约25秒。如果我将一个项目添加到队列中,并且该项目在15:00:00完成,则该服务将在15:00:25ish更新它。

我尝试过使用threading.timer,单个线程和timers.timer,所有工作方式都相同。我也试过在经过的时候停止计时器,虽然它只需不到一秒钟,所以它应该不是问题。

我还尝试将服务附加到调试器,除非我设置断点,否则会发生同样的事情。然后它会在遇到断点时发生,然后按f5继续。

任何人都可以解释为什么服务似乎落后了?还有一个可能的解决办法。

我以为我的线程耗尽了,但我还剩1000个,所以我有点空白。

请询问您是否需要更多详情,我可以提供。

我正在使用.net 4.0 / C#

Threading.Thread

public partial class Service : ServiceBase
{
    Thread thread;

    public Service()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        thread = new Thread(DoWork);
        thread.Start();
    }

    private static void DoWork()
    {
        while (true)
        {
            //finish workingqueueitems
            WorkingQueue.ProcessFinishedItems();

            Thread.Sleep(1000);
        }
    }

    protected override void OnStop()
    {
        thread.Abort();
    }
}

Timers.Timer

public partial class Service : ServiceBase
{
    System.Timers.Timer workingQueueTimer;

    public Service()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        workingQueueTimer = new System.Timers.Timer();
        workingQueueTimer.Elapsed += new ElapsedEventHandler(workingQueueTimer_Elapsed);
        workingQueueTimer.Interval = 1000;
        workingQueueTimer.Enabled = true;
    }

    void workingQueueTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        workingQueueTimer.Enabled = false;

        DoWork();

        workingQueueTimer.Enabled = true;
    }

    private static void DoWork()
    {
        //finish workingqueueitems
        WorkingQueue.ProcessFinishedItems();
    }

    protected override void OnStop()
    {
        workingQueueTimer.Stop();
        workingQueueTimer.Dispose();
    }
}

1 个答案:

答案 0 :(得分:0)

问题可能是由于:

  • 您的 DoWork()方法需要25秒才能完成
  • 您看到数据缓存在某处或事务正在延迟
  • 您的方法 WorkingQueue.ProcessFinishedItems()正在更新错误的行
  • 如果您的服务和数据库位于separeted机器中,则它们具有25秒的不同时钟