. NET Core 2.2 Запланированные задания предотвращают параллелизм на одном задании - PullRequest
0 голосов
/ 25 марта 2020

Это мой класс для работы с CronJobs. Пока он работает нормально сам по себе. Тем не менее, как я могу изменить это так, чтобы, когда задание уже выполнялось, запретить выполнение этого задания?

Я не использую для этого никакую библиотеку.

public abstract class CronJob : IHostedService, IDisposable
 {
     private System.Timers.Timer timer;
     private readonly CronExpression _expression;
     private readonly TimeZoneInfo _timeZoneInfo;

     protected CronJob(string cronExpression, TimeZoneInfo timeZoneInfo)
     {
         _expression = CronExpression.Parse(cronExpression, CronFormat.IncludeSeconds);
         _timeZoneInfo = timeZoneInfo;
     }

     protected virtual async Task ScheduleJob(CancellationToken cancellationToken)
     {
         var next = _expression.GetNextOccurrence(DateTimeOffset.Now, _timeZoneInfo);
         if (next.HasValue)
         {
             var delay = next.Value - DateTimeOffset.Now;
             timer = new System.Timers.Timer(delay.TotalMilliseconds);
             timer.Elapsed += async (sender, args) =>
             {
                 timer.Stop();  // reset timer
                 await DoWork(cancellationToken);
                 await ScheduleJob(cancellationToken);    // reschedule next
             };
             timer.Start();
         }
         await Task.CompletedTask;
     }

     public virtual async Task DoWork(CancellationToken cancellationToken)
     {
         await Task.Delay(5000, cancellationToken);  // do the work
     }

     public virtual async Task StartAsync(CancellationToken cancellationToken)
     {
         await ScheduleJob(cancellationToken);
     }

     public virtual async Task StopAsync(CancellationToken cancellationToken)
     {
         timer?.Stop();
         await Task.CompletedTask;
     }

     public virtual void Dispose()
     {
         timer?.Dispose();
     }
 }

1 Ответ

0 голосов
/ 26 марта 2020

Вам не нужно, потому что. NET Core обрабатывает HostedServices как синглтон. Если вам не нужно размещать несколько экземпляров одного и того же проекта, который содержит этот HostedService, вам придется самостоятельно поддерживать несколько экземпляров вашего проекта.

В вашем случае

Это означает, что ScheduleJob имеет только свой собственный экземпляр и никогда не будет иметь свою собственную глубокую копию, если вы не запустите отдельный экземпляр проекта, который содержит его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...