asp.net core mvc 3.1 中的后台任务

2024-01-06

我想在 ASP.NET Core MVC 应用程序中运行后台任务。

这是我所做的:

在 Startup.cs 中:

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

在 MyTask.cs 中:

public class MyTask: BackgroundService
{
   ...
   public override async Task StartAsync(CancellationToken cancellationToken)
   {
      _logger.LogInformation("StartAsync");
   }

   public override async Task StopAsync(CancellationToken cancellationToken)
   {
      _logger.LogInformation("StopAsync");
   }

   ...
}

这是我注意到的: - 当我在 IIS 上部署网站时,我需要点击一个页面才能启动服务 - 我注意到如果我什么都不做就会调用 Stop。

我的问题是:如何让我的应用程序保持活力? 我需要每分钟运行一次任务......

Thanks


在 ASP.NET Core 中,后台任务可以作为托管服务实现。托管服务是具有实现 IHostedService 接口的后台任务逻辑的类。

定时后台任务使用 System.Threading.Timer 类。计时器触发任务的 DoWork 方法。计时器在 StopAsync 上禁用,并在 Dispose 上处置服务容器时处置:

public class TimedHostedService : IHostedService, IDisposable
{
    private int executionCount = 0;
    private readonly ILogger<TimedHostedService> _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service running.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        var count = Interlocked.Increment(ref executionCount);

        _logger.LogInformation(
            "Timed Hosted Service is working. Count: {Count}", count);
    }

    public Task StopAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

计时器不会等待 DoWork 的先前执行完成,因此所示的方法可能并不适合所有场景。 Interlocked.Increment 用于将执行计数器作为原子操作递增,这确保多个线程不会同时更新executionCount。

该服务使用 AddHostedService 扩展方法在 IHostBuilder.ConfigureServices (Program.cs) 中注册:

    services.AddHostedService<TimedHostedService>();

要查看更多详细信息,请点击以下链接:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net core mvc 3.1 中的后台任务 的相关文章

随机推荐