使用 IHostedService 和 BackgroundService 類在微服務中實現后台任務


https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM