for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Не фоксом единым
  

фоновая задача
S-type

Сообщений: 2649
Дата: 28.04.20 22:51:13
Есть программа. Полный текст приводить не буду Создал работающий код в консольном core приложении (для запуска нужен NuGet пакет NCrontab):

  
  using NCrontab;  
  using System;  
  using System.Threading;  
    
  namespace ConsoleApp  
  {  
      class Program // : BackgroundService  
      {  
          static private volatile Timer timer;  
          static private volatile bool run;  
          static private DateTime nextExecutionTime;  
    
          static void Main(string[] args)  
          {  
              timer = new Timer((obj) =>  
              {  
                  run = true;  
                  Console.WriteLine("Таймер сработал");  
              }, null, TimeSpan.FromMilliseconds(-1), TimeSpan.FromMilliseconds(-1));  
    
              ExecuteAsync();  
    
              Console.ReadLine();  
          }  
    
          static public void ExecuteAsync() // protected override async Task ExecuteAsyn()  
          {  
              Console.WriteLine("Фоновый поток");  
    
              while (true)  
              {  
                  var shedule = CrontabSchedule.TryParse("*/1 * * * *"); // для отладки - будет срабатывать каждую минуту  
                  var start = DateTime.UtcNow;  
                  var next = shedule.GetNextOccurrence(start);  
                  if (next != nextExecutionTime)  
                  {  
                      timer.Change(next - start, TimeSpan.FromMilliseconds(-1));  
                      nextExecutionTime = next;  
                      Console.WriteLine(next.ToShortTimeString());  
                  }  
    
                  if (run)  
                  {  
                      Console.WriteLine("Запущено");  
                      run = false;  
                  }  
    
                  Thread.Sleep(3000);  // await Task.Delay  
              }  
          }  
    
      }  
  }

Некий код должен запускаться каждый час. В примере выше, это код Console.WriteLine("Запущено"). Код не боевой, в том смысле - что он не с продакшен-программы. Так вот. На мой взгляд есть ненулевая вероятность, что таймер не сработает в нужное время. Т.е. большую часть времени он будет работать нормально, но иногда может сбоить. Косвенно это подтверждается, если удалить паузу, или сделать её маленькой (например, 1 тик).

Собственно, вопросы - как можно действительно доказать, что код проблемный? И, можно ли как то изменить этот код, что бы таймер всегда срабатывал?

P.S. В оригинале это класс, отнаследованный от BackgroundService.

P.P.S. Сразу скажу - что такое Quartz.NET знаю, как из windows-планировщика задачи запускать, тоже знаю. Вопрос не об этом.



Исправлено: S-type, 28.04.20 23:55
Ratings: 0 negative/0 positive

Re: фоновая задача
Igor Korolyov
Автор

Сообщений: 33696
Дата: 29.04.20 21:35:48
S-type
В оригинале это класс, отнаследованный от BackgroundService.
Вот этот вариант и надо анализировать - и с изначальными async-ами, а вовсе не переделку на консольную прогу и синхронный рабочий цикл в рамках одного потока. Мне кажется что это будут две очень большие разницы...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: фоновая задача
S-type

Сообщений: 2649
Дата: 30.04.20 00:08:36
Выкинул timer - без него всё работает Пока работает, потом на Quartz.NET перепишу.
Ratings: 0 negative/0 positive

Re: фоновая задача
Igor Korolyov
Автор

Сообщений: 33696
Дата: 01.05.20 11:18:14
Архитектура BackgroundService чутка по ссылке описана. Примитивный цикл с анализом необходимости завершения и фиксированной задержкой между итерациями есть в примере - дополнить его твоим анализом крон-расписания не сложно. Главное понять как это хозяйство будет работать в рамках всего процесса веб-приложения. Кварц это всё же более сложная штука, да и по стеку (реализован на "старых добрых" Thread-ах) это не модное/современное/молодёжное Он по идее больше для вин-сервисов на полном дотнет фреймворке подходит, чем для прямого встраивания в веб-прогу на дотнет коре.
Посмотри на альтернативы, если уж задумаешься о переписывании - типа Hangfire (правда это ещё более сложная и объёмная штука - но для систем где планировщик это важная часть функционала, а не мелочь прилепленная сбоку он может быть гораздо лучше приспособлен).
docs.microsoft.com


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: фоновая задача
S-type

Сообщений: 2649
Дата: 01.05.20 21:17:43
Igor Korolyov
Архитектура BackgroundService чутка по ссылке описана.
Несколько раз перечитывал...

Igor Korolyov
Кварц это всё же более сложная штука, да и по стеку (реализован на "старых добрых" Thread-ах) это не модное/современное/молодёжное
Ну и что, что не модное... Главное - рабочее, и опыт работы с ним есть.

Igor Korolyov
Посмотри на альтернативы, если уж задумаешься о переписывании - типа Hangfire
Спасибо - гляну.
Ratings: 0 negative/0 positive

Re: фоновая задача
sphinx

Сообщений: 27415
Откуда: Каменск-Уральски
Дата: 01.05.20 21:19:42
S-type
Ну и что, что не модное... Главное - рабочее, и опыт работы с ним есть.

+1

Игорь или пытается абсолютно всех сравнить с собой, или что-то не понимает.


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

Re: фоновая задача
S-type

Сообщений: 2649
Дата: 01.05.20 21:24:54
sphinx
Игорь или пытается абсолютно всех сравнить с собой, или что-то не понимает

Вот искренне не понимаю, при чём тут Игорь? Зачем подобные переходы на личность? При этом 0 слов по сути вопроса...
Ratings: 0 negative/1 positive

Re: фоновая задача
Igor Korolyov
Автор

Сообщений: 33696
Дата: 02.05.20 19:17:36
S-type
Ну и что, что не модное... Главное - рабочее, и опыт работы с ним есть.
Ну если на его косяки уже нарывался и знаешь как обходить (или уверен что в данном случае они не повлияют никак), то в принципе почему бы и нет
Но в общем случае, если всё же речь про систему на core, и вопрос не поддержки а переделки, рефакторинга, имеет смысл попробовать что-то поновее.


------------------
WBR, Igor
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 11 Владимир Максимов Burn  (Гостей: 9)

23.09.2020 19:16:53 exec: 0.15
Mem: 1.249 Mb

© 2000-2020 Fox Club 
Яндекс.Метрика