Выполнение отложенных задач в ASP.NET Core
у меня есть вопросик для пэт проекта. Мне нужно реализовать отложенное выполнение некой задачи, допустим: Человек создал заметку, структура такая
class Note
{
public int Id { get; set; }
public string Text { get; set; }
public DateTime Create { get; set; }
public int CreatedBy { get; set; }
}
И хочет её опубликовать в определенной время, допустим через 2,5 дня. Как реализовать данную функцию в среде выполнения asp.net core 3.1, а также учесть будущею нагрузку, если не один человек захочет создать, а больше 2 тысяч людей? Я слышал про библиотеку Hangfire вроде созданный для этой проблемы, но до конца не уверен.
Ответы (1 шт):
Автор решения: Vasya Milovidov
→ Ссылка
Написал для вас абстрактно как это может быть написано:
class Publications {
public DateTime PublicationDate { get; set; }
public bool IsPublicationDone { get; set; }
}
public class Example {
/// Для простоты пример используем массив вместо таблицы в БД
private Publications[] PublicationTable { get; set; }
private Timer timer;
/// <summary>
/// Интервал проверки публикаций.
/// </summary>
private readonly TimeSpan checkPeriod = new TimeSpan(0, 0, 10);
/// После вызова этого метода начнется проверка по таблице
private void StartCheck() {
timer = new System.Threading.Timer(Check, null, TimeSpan.Zero, checkPeriod);
}
private async void Check(object state) {
/// На время действия с публикациями временно отключаем таймер что бы он
/// нас не нагнал пока мы тут возимся
timer.Change(int.MaxValue, int.MaxValue);
try {
foreach(var currentPublictaion in PublicationTable) {
if(!currentPublictaion.IsPublicationDone && currentPublictaion.PublicationDate < DateTime.Now) {
/// Тут мы публикуем то что соответствует currentPublictaion
/// .....
/// Отмечаем что публикация прошла
currentPublictaion.IsPublicationDone = true;
}
}
} finally {
/// Возвращаем таймер в исходное состояние
timer.Change(checkPeriod, checkPeriod);
}
}
}