Windows服务速度

本文关键字:速度 服务 Windows | 更新日期: 2023-09-27 18:29:29

我在Windows服务中遇到两个计时器的问题第二个TimerLimit从不执行。我设置了两个计时器,因为我需要一个来检查和解析一些电子邮件,我需要它不断地进行,而第二个计时器只是在阅读电子邮件后发生了什么事情。我有一种印象,他们在冲突。可能是因为第一个计时器太快了吗?有什么解决这个问题的建议吗?提前感谢

    protected override void OnStart(string[] args)
    {
        stop = false;
        ParseEmail.DeleteFiles();
        timer = new Timer(200);
        timer.Elapsed += new ElapsedEventHandler(ExecuteService);
        timer.Enabled = true;
        timerLimit = new Timer(20000);
        timerLimit.Elapsed += new ElapsedEventHandler(ExecuteServiceLimit);
        timerLimit.Enabled = true;
    }
    protected override void OnStop()
    {
        stop = true;
    }
    private void ExecuteService(object source, ElapsedEventArgs e)
    {
        if (stop)
        {
            return;
        }
        try
        {
            if (ParseEmail.isNotUse)
            {
                ParseEmail.isNotUse = false;
                ParseEmail.ParseValues();
            }
        }
        catch (Exception exp)
        {
            ParseEmail.isNotUse = true;
            Console.WriteLine("Exception: {0}", exp.ToString());
        }
    }
    private void ExecuteServiceLimit(object source, ElapsedEventArgs e)
    {
        if (stop)
        {
            return;
        }
        try
        {
                ParseEmail.CheckLimitOrders();
        }
        catch (Exception exp)
        {
            Console.WriteLine("Exception: {0}", exp.ToString());
        }
    }
}

}

Windows服务速度

你写的东西真的很奇怪。试着从任务管理器中查看CPU负载,如果它太高,你必须增加第一个定时器周期。同时检查ParseEmail.ParseValues()花费的时间。

我会看到你重置

ParseEmail.isNotUse = true;

只有当你有一个例外,它是正确的吗?所以你运行一次这个函数!

首先,您的间隔非常小。如果是System.Timers.Timer,则以毫秒为单位。200ms是每秒5次。你真的需要那么快地处理这些任务吗?

第二,计时器1中发生了什么?因为它的间隔很小,所以它会先开火。如果它需要很长时间才能完成,它可能会占用你所有的CPU周期,阻止计时器2启动。(不太可能,但有可能。)

此外,你的第一个计时器可能在你设置完第二个计时器之前就已经启动了。

现在,我相信您使用的是基于构造函数的System.Timers.Timer。然而,我要说的是:考虑一个BackgroundWorker来处理单独执行线程上的任务。这样一来,一个不会挡住另一个。但只有在确定了合理的触发时间,并且所涉及的数据是线程安全的,并且不会一次分配给多个线程之后,才能这样做。