Фоновые задачи ставятся в очередь и не выполняются - PullRequest
1 голос
/ 31 марта 2020

Я реализовал BackgroundQueue, как объяснено здесь , и как показано:

public ActionResult SomeAction()
{
    backgroundQueue.QueueBackgroundWorkItem(async ct =>
    {
        //Do some work...
    });

    return Ok();
}

Я зарегистрировал BackgroundQueue в Autofa c как:

builder.RegisterType<BackgroundQueue>()
    .As<IBackgroundQueue>()
    .SingleInstance();

Пока все хорошо. Я вызываю свое действие контроллера, и задача добавляется в очередь. И там он остается без выполнения.

Так как мне заставить задачу выполнить?

1 Ответ

3 голосов
/ 31 марта 2020

Реализация BackgroundQueue, которую вы взяли из документации - это только одна часть решения: фоновая очередь будет просто отслеживать задания, которые вы хотите выполнить.

То, что вам также понадобится, находится прямо под документами: QueuedHostedService. Это фоновая служба, которая регистрируется в контейнере DI и запускается при запуске приложения. С этого момента он будет отслеживать ваши BackgroundQueue и отрабатывать задания по мере их постановки в очередь.

Упрощенная примерная реализация этой фоновой службы без регистрации и обработки ошибок может выглядеть следующим образом:

public class QueuedHostedService : BackgroundService
{
    private readonly IBackgroundQueue _backgroundQueue;

    public QueuedHostedService(IBackgroundQueue backgroundQueue)
    {
        _backgroundQueue = backgroundQueue;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var workItem = await _backgroundQueue.DequeueAsync(stoppingToken);
            await workItem(stoppingToken);
        }
    }
}
...