C# 后台任务正在排队,未执行
我已经实现了BackgroundQueue,如图所示:C# 后台任务正在排队,未执行,c#,asp.net-core,autofac,C#,Asp.net Core,Autofac,我已经实现了BackgroundQueue,如图所示: public ActionResult SomeAction() { backgroundQueue.QueueBackgroundWorkItem(async ct => { //Do some work... }); return Ok(); } 我在Autofac注册了BackgroundQueue作为: builder.RegisterType<BackgroundQu
public ActionResult SomeAction()
{
backgroundQueue.QueueBackgroundWorkItem(async ct =>
{
//Do some work...
});
return Ok();
}
我在Autofac注册了BackgroundQueue作为:
builder.RegisterType<BackgroundQueue>()
.As<IBackgroundQueue>()
.SingleInstance();
builder.RegisterType()
.As()
.SingleInstance();
到目前为止还不错。我调用我的控制器操作,任务被添加到队列中。它就在那里,没有被处决
那么,如何让任务执行呢?您从中获取的
BackgroundQueue
实现只是解决方案的一部分:后台队列只会跟踪您想要执行的作业
您还需要的是文档中的下方:QueuedHostedService
。这是一个后台服务,在DI容器中注册,并在应用程序启动时启动。从那时起,它将监视您的背景队列
,并在作业排队时处理它们
此后台服务的简化示例实现(没有日志记录或错误处理)如下所示:
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);
}
}
}
您采用的
BackgroundQueue
实现只是解决方案的一部分:后台队列将只跟踪您想要执行的作业
您还需要的是文档中的下方:QueuedHostedService
。这是一个后台服务,在DI容器中注册,并在应用程序启动时启动。从那时起,它将监视您的背景队列
,并在作业排队时处理它们
此后台服务的简化示例实现(没有日志记录或错误处理)如下所示:
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);
}
}
}