Как ждать 24 часа до завершения асинхронной задачи? - PullRequest
1 голос
/ 24 апреля 2019

Я делаю приложение MVC с .NET Framework, и на одном из моих контроллеров я вызываю асинхронную задачу, которая отправляет электронное письмо зарегистрированному пользователю.

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

Вся задача работает так, как задумано (пользователь получает электронное письмо, когда установлен флажок), но мне нужно подождать 24 часа, прежде чем отправлять электронное письмо, так как это напоминание.

В настоящее время электронное письмо отправляется сразу, как я могу отложить завершение моей «задачи по электронной почте», пока код продолжается?

Ответы [ 3 ]

7 голосов
/ 24 апреля 2019

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

Затем вы можете легко запланировать задание, например:

BackgroundJob.Schedule(
    () => SendEmail("user@domain"),
    TimeSpan.FromDays(1));
1 голос
/ 24 апреля 2019

Это классическая X Y Задача . Несмотря на то, что возможно заставить вашу систему ждать 24 часа, вы создаете очень хрупкую систему, на которую могут повлиять перезагрузки пула приложений и перезагрузка сервера.

Если исключить возможность неожиданной перезагрузки, что произойдет, когда ваш цикл обслуживания завершится и произойдет плановая перезагрузка? Сколько у вас в очереди напоминаний по электронной почте, с которыми вы ничего не можете сделать?

Лучший подход для систем, которые не сразу используют свои данные, - это буферизовать их с помощью какой-либо схемы хранения. Это может быть так же просто, как запись электронных писем в очереди в файлы в системе, или что-то более надежное, например, база данных с выделенной службой отправки электронной почты.

В течение многих лет я использовал МНОГО систем отправления электронной почты, и даже для немедленных отправлений мы использовали посредника базы данных, с одной выделенной службой отправки электронной почты Windows, которая создавала и отправляла реальную электронную почту. Централизовав производство электронной почты, вы не только получите одно место для хранения кода отправки электронной почты, но и увеличите срок службы всей системы.

Бонусные баллы, если ваша база данных является частью кластера высокой доступности, так как в системе такого типа база данных становится критической точкой. Если это так, то вы защищены от любой формы простоя, кроме полного отключения сети.

0 голосов
/ 24 апреля 2019

Дайте Задаче подождать 24 часа, прежде чем отправлять почту.

     await Task.delay(TimeSpan.FromHours(24));

Добавьте эту строку в асинхронную функцию перед отправкой электронного письма

...