后台任务正在排队未执行
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);
}
}
}
我已经按照说明 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);
}
}
}