:: Не фоксом единым
фоновая задача
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Есть программа. Полный текст приводить не буду Создал работающий код в консольном 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-планировщика задачи запускать, тоже знаю. Вопрос не об этом.



Исправлено 1 раз(а). Последнее : S-type, 28.04.20 23:55
Ratings: 0 negative/0 positive
Re: фоновая задача
Igor Korolyov
Автор

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: фоновая задача
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Выкинул timer - без него всё работает Пока работает, потом на Quartz.NET перепишу.
Ratings: 0 negative/0 positive
Re: фоновая задача
Igor Korolyov
Автор

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: фоновая задача
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Архитектура BackgroundService чутка по ссылке описана.
Несколько раз перечитывал...

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

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

Сообщений: 31179
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
S-type
Ну и что, что не модное... Главное - рабочее, и опыт работы с ним есть.

+1

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


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: фоновая задача
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
sphinx
Игорь или пытается абсолютно всех сравнить с собой, или что-то не понимает

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

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


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


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

On-line: 9 (Гостей: 9)

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