.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); } }