1

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

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

它运行良好,但总是迟到 25 秒左右。如果我将一个项目添加到队列中,并且该项目在 15:00:00 完成,则服务将在 15:00:25 左右更新它。

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

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

谁能阐明为什么该服务似乎落后了?和一个可能的修复。

我以为我的线程用完了,但我还剩下 1000 个,所以我有点空白。

请询问您是否需要更多详细信息,以便我提供。

我正在使用 .net 4.0 / C#

线程.线程

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();
    }
}

定时器.定时器

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();
    }
}
4

1 回答 1

0

问题可能是由于:

  • 你的DoWork()方法需要 25 秒才能完成
  • 您看到以某种方式缓存的数据库数据或事务正在延迟它
  • 您的方法WorkingQueue.ProcessFinishedItems()正在更新错误的行
  • 如果您的服务和数据库在单独的机器上,它们的时钟时间不同,为 25 秒
于 2013-11-12T15:28:08.830 回答