![](/img/trans.png)
[英]Is there a way to manually start BackgroundService in Asp.Net core 3.1
[英]How to start BackgroundService in ASP.Net core 3.1 API
我試圖按照本教程了解如何創建后台工作者。
大多數東西對我沒有用,所以我沒有包括在內。 我不需要排隊。 我只需要讓這個 backgroundworker 在后台運行,每 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>();
}
根據我的理解,這應該足以讓它在啟動期間自動啟動 backgroundworker,但事實並非如此。 我究竟做錯了什么?
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();
}
}
我相信我找到了答案。 在第一次調用 API 之前 Startup.cs 沒有運行,在我的一個控制器中調用了一個簡單的測試方法之后,調用了 BackgroundProcessing 方法這有點煩人,因為我希望以后可以創建一個加載的后台工作程序很多數據進入 memory 而不是在第一次調用時發生
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.