Как запустить BackgroundService по таймеру в ASP.NET Core 2.1 - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу запустить фоновое задание в ASP.NET Core 2.1.Он должен запускаться каждые 2 часа, и ему потребуется доступ к моему DI-контейнеру, поскольку он выполнит некоторые очистки в базе данных.Это должен быть async, и он должен работать независимо от моего приложения ASP.NET Core 2.1.

Я видел, что был IHostedService, но ASP.NET Core 2.1 также представил абстрактный класс под названиемBackgroundService, что делает мне больше работы.Кажется хорошо, я хочу использовать это!

Я не смог выяснить, как запустить службу, полученную из BackgroundService по таймеру, хотя.

Нужно ли мне настраиватьэто в ExecuteAsync(token), помня последний раз, когда он работал, и выясняя, было ли это 2 часа, или есть лучший / более чистый способ просто сказать где-нибудь, что он должен запускаться каждые 2 часа?

Кроме того, мой подход к моей проблеме правильный с BackgroundService?

Спасибо!

Редактировать:

Опубликовал это на репо MS extensions

Ответы [ 2 ]

0 голосов
/ 17 января 2019

@ Панагиотис Канавос дал ответ в комментариях к моему вопросу, но не опубликовал его как фактический ответ;этот ответ посвящен ему / ей.

Для создания службы я использовал Временную фоновую службу , такую ​​как в Microsoft docs.

internal class TimedHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is starting.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Background Service is working.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

В моем случаеЯ сделал _timer асинхронный вызов, выполнив new Timer(async () => await DoWorkAsync(), ...).

В будущем может быть написано расширение, которое сделает такой класс доступным в репозитории Extensions, потому что я думаю, что это весьма полезно.Я разместил ссылку на проблему github в описании.

Совет. Если вы планируете использовать этот класс повторно для нескольких размещенных сервисов, подумайте о создании базового класса, который содержит таймер и реферат PerformWork() или что-то в этом роде.Логика «времени» только в одном месте.

Спасибо за ваши ответы!Я надеюсь, что это поможет кому-то в будущем.

0 голосов
/ 11 декабря 2018

Один из способов добиться этого - использовать HangFire.io, он будет обрабатывать запланированные фоновые задачи, управлять балансировкой между серверами и довольно масштабируем.

См. Повторяющиеся задания на https://www.hangfire.io

...