我想在 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(使用前将#替换为@)