Выполнение отложенных задач в 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);
        }
    }
}

→ Ссылка