Моим идеальным решением было бы, чтобы таймер работал внутри моего приложения и вызывал метод в службе каждые 24 часа.Конечно, это невозможно ...
На самом деле это очень возможно, используя IHostedService
.Вам нужно некоторое время, чтобы прочитать полную документацию , но просто, для вашего сценария, вам просто понадобится что-то вроде:
internal class NightlyEmailHostedService : IHostedService, IDisposable
{
private Timer _timer;
public Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromHours(24));
return Task.CompletedTask;
}
private void DoWork(object state)
{
// send email
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
Затем в Startup.cs просто добавьте:
services.AddHostedService<NightlyEmailHostedService>();
Это очень наивный подход.По сути, он просто запускает таймер, который будет запускаться раз в 24 часа, но в зависимости от того, когда запускается ваше приложение, он не всегда может быть ночью.В действительности, вы, вероятно, захотите, чтобы таймер запускался каждую минуту или около того, и сравнивайте с конкретным временем, когда вы действительно хотите, чтобы электронная почта выходила.Существует интересная реализация обработки времени в стиле cron через IHostedService
, на которую вы можете сослаться.
Суть в том, что очень возможно сделать все это в вашем приложении,не требуя ничего дополнительного, как Hangfire.Тем не менее, вам придется выполнить немного больше работы, чем, конечно, использовать что-то вроде Hangfire.