如何在 ASP.NET Core 中安排后台任务(作业)?

后台任务,也称为作业,本质上是不打算在应用程序的正常流程中执行的服务,例如发送电子邮件确认或定期清理数据库以清除不活动的帐户。这些工作不是为了与客户交互或处理用户输入。相反,它们在后台运行,处理队列中的项目或执行长时间运行的进程。

在后台作业或服务中执行这些任务的主要优势是,您可以保持应用程序响应。例如,当用户注册时,您可以安排将电子邮件发送给用户的后台作业,而不是在同一请求中向他们发送电子邮件。

ASP.NET Core 通过提供在应用程序启动时在后台运行任务的抽象来支持后台任务。在ASP.NETCore 中,这些类型的后台任务称为托管服务,因为您在应用程序中托管它们。

您可以使用IHostedService接口在后台运行任务。托管服务仅指示包含后台任务逻辑的类。当应用程序启动时,您注册多个在应用程序运行时在后台运行的后台任务。当应用程序停止时,服务也会停止。甚至ASP.NET核心服务器Kestrel也作为 IHostedService 运行。

IHostedService 接口包含两个方法:

  • StartAsync(CancellationToken): 提供启动后台任务的逻辑。

  • StopAsync(CancellationToken): 在应用程序停止之前调用。它提供了结束后台任务的逻辑。

例子:

下面是一个说明托管服务配置的示例。

public class Program{
   public static void Main(string[] args){
      CreateHostBuilder(args).Build().Run();
   }

   public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>{
         webBuilder.UseStartup<Startup>();
      })
      .ConfigureServices(services =>{
         services.AddHostedService<VideosWatcher>();
      });
}

您可以使用 BackgroundService 类作为基类来实现 IHostedService 接口。它包含一个ExecuteAsync(CancellationToken)用于运行后台服务的调用。该方法返回一个代表后台服务生命周期的 Task 对象。