使用 IHostedService 和 BackgroundService 类在微服务中实现后台任务
.NET Core 2.1 中引入了 Host
(实现 IHost
的基类)。 基本上,Host
能让用户拥有与 WebHost
(依赖项注入、托管服务等)相似的基础结构,但在这种情况下,只需拥有一个简单轻便的进程作为主机,与 MVC、Web API 或 HTTP 服务器功能无关。
因此,可以选择一个专用主机进程或使用 IHost
创建一个来专门处理托管服务,例如仅用于托管 IHostedServices
的微服务,或者也可以选择性地扩展现有的 ASP.NET Core WebHost
,例如现有的 ASP.NET Core Web API 或 MVC 应用。
每种方法都有优缺点,具体取决于业务和可伸缩性需求。 重要的是,如果后台任务与 HTTP (IWebHost
) 无关,则应使用 IHost
。
练习 :
StartUp.cs注册
services.AddSingleton<IHostedService, BGService>();
创建类
public class BGService : BackgroundService { private CancellationTokenSource cancelSource; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { //while (!stoppingToken.IsCancellationRequested) //{ // await Task.Delay(1000, stoppingToken).ContinueWith(x => // { // Console.WriteLine($"{DateTime.Now.ToString()}"); // }); //} for (int i = 0; i < 10; i++) { if (!stoppingToken.IsCancellationRequested) { await Task.Delay(1000, stoppingToken).ContinueWith(x => { Console.WriteLine($"{DateTime.Now.ToShortDateString()}"); }); } if (i == 5) { await StopAsync(stoppingToken); } } } public override Task StartAsync(CancellationToken cancellationToken) { cancelSource = new CancellationTokenSource(); Console.WriteLine("开始任务"); return base.StartAsync(cancelSource.Token); } public override Task StopAsync(CancellationToken cancellationToken) { cancelSource.Cancel(); Console.WriteLine("任务结束"); return base.StopAsync(cancelSource.Token); } }