Ответ от FlashOver верен - ExecuteAsync
вызывается один раз. Не повторно.
Если вы хотите, чтобы что-то произошло в c время в IHostedService
, прочтите эту статью от Microsoft.
Я вставлю код здесь на случай, если ссылка сгниет:
public class TimedHostedService : IHostedService, IDisposable
{
private int executionCount = 0;
private readonly ILogger<TimedHostedService> _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Timed Hosted Service running.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
var count = Interlocked.Increment(ref executionCount);
_logger.LogInformation(
"Timed Hosted Service is working. Count: {Count}", count);
}
public Task StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Timed Hosted Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
Вставьте его так:
services.AddHostedService<TimedHostedService>();
Теперь имейте в виду, что если ваше приложение масштабируется по горизонтали, где у вас более одного Например, у вас будет запущено более одного таймера. Обычно это нехорошо.
В случаях, когда мне нужно, чтобы задача запускалась в определенное c время суток, я использую функцию Azure, настроенную как задание CRON.