如何在ASP中启动后台服务.Net core 3.1 API



我试着按照这个教程来创建一个后台工作者。

大多数东西对我来说都没有用,所以我没有包括它。我不需要排队。我只需要让这个后台工作人员每隔X小时在后台做一些事情我的工人长这样。不幸的是,它似乎从未调用ExecuteAsync方法

public class EnergySolutionBackgroundWorker : BackgroundService
{       
private readonly ILogger<EnergySolutionBackgroundWorker> _logger;
public EnergySolutionBackgroundWorker(ILogger<EnergySolutionBackgroundWorker> logger)
{         
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("{Type} is now running in the background.", nameof(BackgroundWorker));
await BackgroundProcessing(stoppingToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogCritical("The {Type} is stopping due to a host shutdown.", nameof(BackgroundWorker));
return base.StopAsync(cancellationToken);
}
private async Task BackgroundProcessing(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Task.Delay(new TimeSpan(0, 0, 1), stoppingToken);
// Doing some tasks
}
catch (Exception ex)
{
_logger.LogCritical("An error occurred when publishing a book. Exception: {@Exception}", ex);
}
}
}        
}

在Startup.cs中我有以下内容:

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHostedService<EnergySolutionBackgroundWorker>();
}

根据我的理解,这应该足以让它在启动时自动启动后台工作程序,但事实并非如此。我做错了什么?

  1. 可以在开始功能中添加定时器。定时后台任务使用System.Threading.Timer类。计时器触发任务的DoWork方法。该定时器在停止异步时禁用,在Dispose:
  2. 处置服务容器时被处置。
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();
}
}
  1. 有参考

我相信我找到了答案!cs在第一次调用API之前不会运行。在我的一个控制器中调用了一个简单的Test方法之后,就调用了BackgroundProcessing方法这有点烦人,因为我希望我以后可以创建一个后台工作程序,将大量数据加载到内存中,而不是在第一次调用时发生

最新更新