From: 011netservice@gmail.com Date: 2025-07-07 Subject: Worker https://svc.011.idv.tw/CodeHelper/cs/KeyWord/Worker.txt 歡迎來信交流, 訂購軟體需求. #### Worker 在 .NET 的背景服務架構中,通常是用來執行長時間運作的任務, 例如監聽 TCP 連線、處理排程任務、或持續監控某些資源。 services.AddHostedService(); 註冊為一個 Hosted Service, 代表應該實作 IHostedService 或繼承 BackgroundService. 典型 Worker 範例: public class Worker : BackgroundService { private readonly ILogger _logger; // 用來記錄日誌,方便除錯與監控 private readonly TCPWorkerService _tcpService; public Worker(ILogger logger, TCPWorkerService tcpService) { _logger = logger; _tcpService = tcpService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); while (!stoppingToken.IsCancellationRequested) { _tcpService.Listen(); // 假設是 TCP 監聽邏輯 await Task.Delay(1000, stoppingToken); // 每秒執行一次 } _logger.LogInformation("Worker stopping at: {time}", DateTimeOffset.Now); } } ExecuteAsync() 是背景服務的主邏輯,會在應用程式啟動後自動執行,直到應用程式結束或被取消。 通常在 Worker中執行以下任務,例如: - 接收並處理 TCP 封包 - 定時掃描資料庫或 API - 處理佇列訊息(如 Kafka、RabbitMQ) - 執行排程任務(如每小時備份) #### 簡單的 C# BackgroundService 範例 建立一個在背景執行的服務,並定期執行某些任務: ### ✅ 建立 BackgroundService 範例 using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; public class MyBackgroundService : BackgroundService { private readonly ILogger _logger; public MyBackgroundService(ILogger logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Background service is starting."); while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Background service is running at: {time}", DateTimeOffset.Now); // 模擬工作,例如每 5 秒執行一次 await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); } _logger.LogInformation("Background service is stopping."); } } ### ✅ 在 Program.cs 中註冊服務(.NET 6+) using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService(); }) .Build(); await host.RunAsync(); 說明 - `BackgroundService` 是 `IHostedService` 的抽象實作,適合用來建立長時間執行的背景任務。 - `ExecuteAsync` 是主要的執行邏輯,會在應用程式啟動後執行,並持續運作直到應用程式關閉。 - `CancellationToken` 用來偵測應用程式是否正在關閉,以便安全地停止背景任務。 當然可以!以下是加入**錯誤處理**的版本,讓你的 `BackgroundService` 更加穩健,能夠在執行過程中捕捉例外並記錄錯誤: --- #### ✅ 加入錯誤處理的 BackgroundService 範例 using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; public class MyBackgroundService : BackgroundService { private readonly ILogger _logger; public MyBackgroundService(ILogger logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Background service is starting."); while (!stoppingToken.IsCancellationRequested) { try { _logger.LogInformation("Background service is running at: {time}", DateTimeOffset.Now); // 模擬可能會拋出例外的工作 DoWork(); await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); } catch (OperationCanceledException) { // 當服務被取消時,這是預期的例外,不需要記錄為錯誤 _logger.LogInformation("Background service cancellation requested."); } catch (Exception ex) { // 捕捉所有其他未處理的例外 _logger.LogError(ex, "An error occurred while executing the background task."); } } _logger.LogInformation("Background service is stopping."); } private void DoWork() { // 模擬可能會發生錯誤的邏輯 var rnd = new Random(); if (rnd.Next(0, 5) == 0) // 偶爾拋出錯誤 { throw new InvalidOperationException("Something went wrong during background processing."); } // 正常工作邏輯 _logger.LogInformation("Work completed successfully."); } } 補充建議 - **重試機制**:你可以加入重試邏輯,例如使用 Polly 套件。 - **錯誤通知**:可以整合 email、Slack、Teams 等通知機制,讓錯誤不只寫入 log。 - **健康檢查**:搭配 ASP.NET Core 的 Health Checks 來監控服務狀態。 todo: 如何測試這個 Worker 類別? 加入重試機制 錯誤通知功能