.Net 中提供了一系列的管理對象集合的類型,數組、可變列表、字典等。從類型安全上集合分為兩類,泛型集合 和 非泛型集合,傳統的非泛型集合存儲為Object,需要類型轉。而泛型集合提供了更好的性能、編譯時類型安全,推薦使用。 ...
NET 8 引入了強大的功能,用於使用 和 管理後臺任務。這些服務使長時間運行的操作(如計劃任務、後臺處理和定期維護任務)能夠無縫集成到您的應用程式中。本文探討了這些新功能,並提供了實際示例來幫助你入門。您可以在我的 GitHub 存儲庫中找到這些示例的源代碼。IHostedService
BackgroundService
什麼是後臺服務?
.NET 中的後臺服務允許您在後臺獨立於主應用程式線程運行任務。這對於需要連續或定期運行而不阻塞主應用程式流的任務至關重要。
IHostedService
介面
該介面定義了兩種方法:IHostedService
1 StartAsync(CancellationToken cancellationToken):在應用程式主機啟動時調用。 2 StopAsync(CancellationToken cancellationToken):在應用程式主機執行正常關閉時調用。
IHostedService
實現示例:
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 using Microsoft.Extensions.Hosting; 5 using Microsoft.Extensions.Logging; 6 7 public class TimedHostedService : IHostedService, IDisposable 8 { 9 private readonly ILogger<TimedHostedService> _logger; 10 private Timer _timer; 11 12 public TimedHostedService(ILogger<TimedHostedService> logger) 13 { 14 _logger = logger; 15 } 16 17 public Task StartAsync(CancellationToken cancellationToken) 18 { 19 _logger.LogInformation("Timed Hosted Service running."); 20 21 _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); 22 23 return Task.CompletedTask; 24 } 25 26 private void DoWork(object state) 27 { 28 _logger.LogInformation("Timed Hosted Service is working."); 29 } 30 31 public Task StopAsync(CancellationToken cancellationToken) 32 { 33 _logger.LogInformation("Timed Hosted Service is stopping."); 34 35 _timer?.Change(Timeout.Infinite, 0); 36 37 return Task.CompletedTask; 38 } 39 40 public void Dispose() 41 { 42 _timer?.Dispose(); 43 } 44 }
BackgroundService
類
該類是一個抽象基類,用於簡化後臺任務的實現。它提供了一種方法來覆蓋:BackgroundService
ExecuteAsync(CancellationToken stoppingToken):
包含後臺任務的邏輯,並運行到應用程式關閉為止。
BackgroundService
實現示例:
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 using Microsoft.Extensions.Hosting; 5 using Microsoft.Extensions.Logging; 6 7 public class TimedBackgroundService : BackgroundService 8 { 9 private readonly ILogger<TimedBackgroundService> _logger; 10 11 public TimedBackgroundService(ILogger<TimedBackgroundService> logger) 12 { 13 _logger = logger; 14 } 15 16 protected override async Task ExecuteAsync(CancellationToken stoppingToken) 17 { 18 _logger.LogInformation("Timed Background Service running."); 19 20 while (!stoppingToken.IsCancellationRequested) 21 { 22 _logger.LogInformation("Timed Background Service is working."); 23 await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); 24 } 25 26 _logger.LogInformation("Timed Background Service is stopping."); 27 } 28 }
主要區別
-
抽象級別:
IHostedService
:需要手動實現啟動和停止邏輯。BackgroundService
:通過提供具有要重寫的單個方法的基類來簡化實現。
-
使用案例:
IHostedService
:適用於需要對服務生命周期進行精細控制的更複雜的方案。BackgroundService
:非常適合受益於減少樣板代碼的更簡單、長時間運行的任務。
結論
.NET 8 的後臺服務(通過 和 )提供了一種可靠且靈活的方式來管理後臺任務。通過根據您的需求選擇適當的抽象,您可以有效地在應用程式中實現和管理長時間運行的操作。這些新功能增強了創建響應迅速、可伸縮且可維護的 .NET 應用程式的能力。IHostedService
BackgroundService