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 APIOrderUow
纯粹是为了与业务层解耦,但允许访问“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谢谢。。。我从另一根线上拔下它,因为这是我得到的感觉。我想关键是,它们应该是相互冲突的。他们都是一个痛苦的“哔哔”声开始工作,其中至少有一个充满了错误,