Windows服务运行但在两天后停止处理

时间:2017-01-12 16:30:19

标签: c# windows-services

我看过很多关于这个问题的帖子但不符合我的标准。

话虽如此,这是我构建的第一个“需要”执行大量逻辑的人。所有这些都可以工作几天但在此之后逻辑停止工作,没有登录事件查看器,也没有发送电子邮件(例外)。

我想知道我的逻辑是否正确......寻找建议和指示。

public partial class QuayService : ServiceBase
{
    private System.Timers.Timer m_mainTimer;
    private bool m_timerTaskSuccess;
    private Email _email;
    public QuayService()
    {
        InitializeComponent();
        _email = new Email();
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            // Create and start a timer.
            m_mainTimer = new System.Timers.Timer();
            m_mainTimer.Interval = 5000;   // every 5 seconds
            m_mainTimer.Elapsed += m_mainTimer_Elapsed;
            m_mainTimer.AutoReset = false;  // makes it fire only once
            m_mainTimer.Start(); // Start

            m_timerTaskSuccess = false;

            _email.SendEmail("Quay", "(Shopify)Quay Service Started",
                "(Shopify)Quay Service Successfuly Started");

            EventLog.WriteEntry("(Shopify)Quay Service Started...");
        }
        catch (Exception ex)
        {
            // Log/Send Email
            _email.SendEmail("Quay", "Error starting (Shopify)Quay Service", ex.Message + " " + 
                ex.InnerException.Message);

            EventLog.WriteEntry("Error starting (Shopify)Quay service and timer..." + ex.Message + " " +
                ex.InnerException.Message);
        }
    }

    protected override void OnStop()
    {
        try
        {
            // Service stopped. Also stop the timer.
            m_mainTimer.Stop();
            m_mainTimer.Dispose();
            m_mainTimer = null;

            _email.SendEmail("Quay", "(Shopify)Quay Service stopped",
                "(Shopify)Quay Service Successfuly Stopped");

            EventLog.WriteEntry("(Shopify)Quay Service stopped...");
        }
        catch (Exception ex)
        {
            _email.SendEmail("Quay", "Error stopping (Shopify)Quay Service", ex.Message + " " +
                ex.InnerException.Message);

            // Log/Send Email
            EventLog.WriteEntry("Error stopping (Shopify)Quay timer and service..." + ex.Message + " " +
                ex.InnerException.Message);
        }
    }

    void m_mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            var orderUoW = new OrderUoW();
            orderUoW.Create();

            m_timerTaskSuccess = true;
        }
        catch (Exception ex)
        {
            //Error with timer elapsed
            m_timerTaskSuccess = false;

            _email.SendEmail("Quay", "Error creating (Shopify)Quay order(s)", ex.Message + " " +
                ex.InnerException.Message);

            EventLog.WriteEntry("Error creating (Shopify)Quay order(Time elapsed event)..." + ex.Message
                + " " + ex.InnerException.Message);
        }
        finally
        {
            if (m_timerTaskSuccess)
            {
                m_mainTimer.Start();
            }
        }
    }
}

为了达到这一点,我“谷歌搜索”和“搜索”以找到计时器的最佳用途...我还有一个天真的测试层,可以重现服务中的内容,我可以通过任何例外情况,但这个让我疯了。

真正感谢任何帮助!

//修改

关于:

的一点解释
var orderUoW = new OrderUoW(); 
orderUoW.Create();

OrderUoW是我的服务中的一个类,它继承自BatchOrder,负责许多操作,包括连接到两个数据库和轮询shopify API ... OrderUow纯粹是为了从业务层分离但允许访问“x”方法。

一切都完美无缺地工作了两天但似乎停了下来。我没有在shopify中达到要求限制......所以此刻,我不知所措。

1 个答案:

答案 0 :(得分:3)

经过许多时刻的搔痒和MS Timer Bug的极度烦恼。

它不仅吞下异常,定时器也没有引发事件!我的服务暂停了,这特别困难,因为它也吞没了例外。

现在我确实沿着Threading.Timer

实施了一半的路线
  1. 不要使用System.Windows.Forms.Timer,因为它不起作用(这才有意义)。

  2. 不要使用System.Threading.Timer,因为它不起作用,请改用System.Timers.Timer。

  3. 不要使用System.Timers.Timer,因为它不起作用,请改用System.Threading.Timer。

  4. Related question

    我真的不会对这些步骤带来的问题感到困扰,因为我的目标是专注于业务逻辑。所以我决定使用Quartz.Net

    它使我的生活更轻松,似乎完美无缺! 45-60分钟的工作。

    基本设置:

    1,Nuget>石英

    2,新文件夹> QuartzComponents>工作和时间表

    enter image description here

    3,在各个文件夹中添加了OrderJob.csOrderJobSchedule.cs

    OrderJob.cs逻辑:

     public sealed class OrderJob : IJob
     {
        public void Execute(IJobExecutionContext context)
        {
                var orderUoW = new OrderUoW();
                orderUoW.Create();
         }
      }
    

    请注意,它创建了我的UoW的实例?!?它会在每次传球中击中的逻辑。

    OrderJobSchedule.cs逻辑:

       public sealed class OrderJobSchedule
        {
            public void Start()
            {
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Start();
    
                IJobDetail job = JobBuilder.Create<OrderJob>().Build();
    
                ITrigger trigger = TriggerBuilder.Create()
                       .WithSimpleSchedule(a => a.WithIntervalInSeconds(15).RepeatForever())
                       .Build();
    
                scheduler.ScheduleJob(job, trigger);
            }
    
            public void Stop()
            {
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                scheduler.Shutdown();
            }
        }
    

    这里有很多魔力,但要强调:

    JobBuilder.Create<OrderJob>().Build();
    
    a.WithIntervalInSeconds(15).RepeatForever()
    

    现在我们需要为&#34; guts&#34;添加逻辑。服务:

    public partial class QuayService : ServiceBase
        {
            OrderJobSchedule scheduler;
            public QuayService()
            {
                InitializeComponent();
            }
            protected override void OnStart(string[] args)
            {
                try
                {
                    scheduler = new OrderJobSchedule();
                    scheduler.Start();
    
                    SendEmail("(Shopify)Quay Service Started",
                        "(Shopify)Quay Service Successfuly Started");
                }
                catch (Exception ex)
                {
                    ProcessException(ex, "Error starting (Shopify)Quay Service");
                    EventLog.WriteEntry("Error starting (Shopify)Quay service and timer..." + ex.Message);
                }
            }
            protected override void OnStop()
            {
                try
                {
                    if (scheduler != null)
                    {
                        scheduler.Stop();
                    }
    
                    SendEmail("(Shopify)Quay Service stopped",
                        "(Shopify)Quay Service Successfuly Stopped");
                }
                catch (Exception ex)
                {
                    ProcessException(ex, "Error stopping (Shopify)Quay Service");
                    EventLog.WriteEntry("Error stopping (Shopify)Quay timer and service..." + ex.Message);
                }
            }
            private void SendEmail(string subject, string body)
            {
                new Email().SendErrorEmail("Quay", subject, body);
            }
            private void ProcessException(Exception ex,
                string customMessage)
            {
                var innerException = "";
                if (ex.InnerException != null)
                    innerException = (!string.IsNullOrWhiteSpace(ex.InnerException.Message)) ? ex.InnerException.Message : "";
    
    
                new Email().SendErrorEmail("Quay", customMessage, 
                    ex.Message + " " + innerException);
            }
        } 
    

    很容易设置和解决我Timers.Timer的可怕体验虽然我没有解决核心问题,但我提出了一个解决方案并且实现了一个无错误的工作系统。

    请注意未来的读者请勿使用 System.Timers.Timer,除非您准备添加&#34; hack&#39; ish&#34;固定。