Ответ 1
После многих моментов царапин моей головы и крайнего раздражения с MS Timer Bug.
Не только проглотил исключения, таймер не поднял это событие! Мое служение висело, что было особенно сложно, потому что оно также проглотило исключения.
Теперь я пошел по пути реализации половины Threading.Timer
-
Не используйте System.Windows.Forms.Timer, потому что он не будет работать (это имеет смысл).
-
Не используйте System.Threading.Timer, потому что он не работает, вместо этого используйте System.Timers.Timer.
-
Не используйте System.Timers.Timer, потому что он не работает, вместо этого используйте System.Threading.Timer.
Я действительно не мог беспокоиться о проблемах, связанных с этими шагами, поскольку моя цель состояла в том, чтобы сосредоточиться на бизнес-логике. Поэтому я принял решение использовать Quartz.Net.
Это облегчило мою жизнь и, похоже, отлично работает! 45-60 минут работы.
Основная настройка:
1, Nuget > Quartz
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();
}
}
Обратите внимание, что он создает экземпляр моего 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()
Теперь, когда нам нужно добавить логику в "кишки" сервиса:
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
, если вы не готовы добавить "хакерское" исправление.