后台任务正在排队未执行

Background tasks are being queued and not executed

我已经按照说明 here 实现了 BackgroundQueue,如图所示:

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

    return Ok();
}

我使用 Autofac 将 BackgroundQueue 注册为:

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

到目前为止一切顺利。我调用我的控制器操作并将任务添加到队列中。它留在那里没有被执行。

那么如何让任务执行呢?

您从 the documentation 获取的 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);
        }
    }
}