簡體   English   中英

ASP.Net core 3.1中如何啟動BackgroundService API

[英]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,但事實並非如此。 我究竟做錯了什么?

  1. 您可以在開始時添加計時器 function。定時后台任務使用 System.Threading.Timer class。計時器觸發任務的 DoWork 方法。 計時器在 StopAsync 上被禁用,並在服務容器在 Dispose 上被釋放時被釋放:
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. 有一個參考

我相信我找到了答案。 在第一次調用 API 之前 Startup.cs 沒有運行,在我的一個控制器中調用了一個簡單的測試方法之后,調用了 BackgroundProcessing 方法這有點煩人,因為我希望以后可以創建一個加載的后台工作程序很多數據進入 memory 而不是在第一次調用時發生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM