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

Asp.net core asp.net核心mvc 3.1中的后台任务,asp.net-core,.net-core,asp.net-core-mvc,Asp.net Core,.net Core,Asp.net Core Mvc,我想在asp.net核心mvc应用程序中运行后台任务 以下是我所做的: 在Startup.cs中: public void ConfigureServices(IServiceCollection services) { ... services.AddHostedService<MyTask>(); } 我注意到: -当我在IIS上部署我的网站时,我需要点击一个页面以启动服务 -我已经注意到,如果我什么也不做,车站就会被叫停 我的问题是:如何保持我的应用程序的活力?

我想在asp.net核心mvc应用程序中运行后台任务

以下是我所做的:

在Startup.cs中:

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddHostedService<MyTask>();
}
我注意到: -当我在IIS上部署我的网站时,我需要点击一个页面以启动服务 -我已经注意到,如果我什么也不做,车站就会被叫停

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


感谢您不要在MVC应用程序中运行后台任务,也许您应该将其作为windows服务运行。可以理解的是,在你点击第一页之前,IIS不会启动你的后台任务——也就是当它启动你的应用程序时。请查看这似乎是asp.net的默认行为。您需要使asp.net应用程序“始终运行”。您可以从IIS管理器以及我相信的一些配置文件中执行此操作

有很多关于这方面的文章,比如:

此外,我在Hangfire方面也取得了成功;您甚至可以将后台线程的处理移动到不同的进程,即使是在不同的主机上

另见:


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

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

公共类TimedHostedService:IHostedService,IDisposable
{
private int executionCount=0;
专用只读ILogger\u记录器;
私人定时器;
公共TimedHostedService(ILogger记录器)
{
_记录器=记录器;
}
公共任务StartAsync(取消令牌停止停止)
{
_logger.LogInformation(“定时托管服务正在运行”);
_计时器=新计时器(DoWork、null、TimeSpan.Zero、,
时间跨度从秒(5)开始;
返回Task.CompletedTask;
}
私有无效工作(对象状态)
{
变量计数=联锁增量(参考执行计数);
_logger.login信息(
“定时托管服务正在工作。计数:{Count}”,计数);
}
公共任务StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation(“定时托管服务正在停止”);
_计时器?更改(Timeout.Infinite,0);
返回Task.CompletedTask;
}
公共空间处置()
{
_计时器?.Dispose();
}
}
计时器不会等待之前的DoWork执行完成,因此所示的方法可能不适用于所有场景。Increment用于将执行计数器作为一个原子操作递增,以确保多个线程不会同时更新executionCount

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

services.AddHostedService();

要查看更多详细信息,请单击下面的链接:

如果您将asp.net核心应用程序作为服务运行,它将使用kestrel而不是iss,对吗?
public class MyTask: BackgroundService
{
   ...
   public override async Task StartAsync(CancellationToken cancellationToken)
   {
      _logger.LogInformation("StartAsync");
   }

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

   ...
}