C# Windows服务运行,但两天后停止处理

C# Windows服务运行,但两天后停止处理,c#,windows-services,C#,Windows Services,关于这个问题,我已经看到了不少帖子,但似乎不符合我的标准 话虽如此,这是我构建的第一个“需要”执行大量逻辑的系统。所有这些都可以在几天内正常工作,但在这之后,逻辑停止工作,事件查看器中没有日志,也没有发送电子邮件(例外) 我想知道我的逻辑是否不正确。。。寻找建议和指点 public partial class QuayService : ServiceBase { private System.Timers.Timer m_mainTimer; private bool m_ti

关于这个问题,我已经看到了不少帖子,但似乎不符合我的标准

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

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

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内达到请求限制。。。所以现在,我不知所措。

在经历了很多时间的挠头和对工作的极度烦恼之后

它不仅吞噬了异常,计时器也没有引发事件!我的服务被挂起,这特别困难,因为它也包含例外

现在,我确实走上了用
Threading.Timer

  • 不要使用System.Windows.Forms.Timer,因为它不起作用(这才有意义)

  • 不要使用System.Threading.Timer,因为它不工作,请改用System.Timers.Timer

  • 不要使用System.Timers.Timer,因为它不工作,请改用System.Threading.Timer

  • 我真的不能为这些步骤带来的问题而烦恼,因为我的目标是专注于业务逻辑。所以我决定使用

    这让我的生活轻松多了,而且似乎工作得很完美!45-60分钟的工作量

    基本设置:

     public sealed class OrderJob : IJob
     {
        public void Execute(IJobExecutionContext context)
        {
                var orderUoW = new OrderUoW();
                orderUoW.Create();
         }
      }
    
       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();
            }
        }
    
    1,Nuget>石英

    2、新文件夹>QuartzComponents>作业和计划

    3,在各自的文件夹中添加了
    OrderJob.cs
    OrderJobSchedule.cs

    OrderJob.cs逻辑:

     public sealed class OrderJob : IJob
     {
        public void Execute(IJobExecutionContext context)
        {
                var orderUoW = new OrderUoW();
                orderUoW.Create();
         }
      }
    
       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();
            }
        }
    
    请注意,它创建了my UoW的实例?!?每次传球都会击中的逻辑

    OrderJobSchedule.cs逻辑:

     public sealed class OrderJob : IJob
     {
        public void Execute(IJobExecutionContext context)
        {
                var orderUoW = new OrderUoW();
                orderUoW.Create();
         }
      }
    
       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();
            }
        }
    
    非常容易设置并解决了我使用
    计时器的可怕体验。虽然我没有解决核心问题,但我想出了一个解决方案,并获得了一个无缺陷的工作系统


    请注意未来的读者不要使用
    System.Timers.Timer
    ,除非您准备添加“黑客”补丁。

    您应该在
    \u email.sendmail周围设置一个try/catch块,因为它也可能失败。请注意,谢谢!我想知道这是否可能是一个@stuartd cheers,我会检查一下。然后我相信你需要添加更多日志,看看在崩溃之前执行中会发生什么。正如我所说,你的代码看起来不错,因此可能值得调查外部因素,如数据库、shopify、电子邮件等。还可以添加一些系统指标,以监控操作系统在崩溃时是否正常,以防出现磁盘io、cpu、mem、网络等资源问题。需要识别问题并对其进行排序,并且您的代码没有任何明显的问题。这是一个很好的重写。我认为你的答案中的第2点和第3点相互矛盾:2,不要使用System.Threading.Timer,因为它不工作,所以请使用System.Timers.Timer。3、不要使用System.Timers.Timer,因为它不工作,请使用System.Threading.Timer。@i.net谢谢。。。我从另一根线上拔下它,因为这是我得到的感觉。我想关键是,它们应该是相互冲突的。他们都是一个痛苦的“哔哔”声开始工作,其中至少有一个充满了错误,