[C#] 用.NET 6 Worker 開發 Windows Service

用.NET6 Worker 開發 Windows Service

用 .NET6 Worker
開發 Windows Service

在 Windows 系統中,Windows Service 是一種在背景執行的應用程式,可以在系統啟動時自動運行並持續運行,適合用於執行長時間或定期的任務。過去在 .NET Framework 上開發 Windows Service 專案,在偵錯上需要額外撰寫類似Console的程式來偵錯,而在 .NET 6 中,引入了 Worker Service 的概念,它提供了更簡潔和高效的方式來開發 Windows Service。本篇文章將介紹如何使用 .NET 6 Worker 開發 Windows Service,讓你能夠輕鬆地建立可靠的後台應用程式。

建立 .NET 6 Worker 專案

首先,我們需要建立一個 .NET 6 Worker 專案。打開 Visual Studio 或任何適用的編輯器,選擇建立新的專案,並選擇「Worker」範本。這將建立一個基本的 Worker Service 專案結構,包含 Program.cs 和 Worker.cs 檔案

安裝NuGet 套件

使用command或是Nuget套件管理員找到Microsoft.Extensions.Hosting.WindowsServices套件並安裝。

用 Nuget 套件安裝 WindowsServices

更新專案檔

新增<Nullable>enable<Nullable> 節點

在.net6專案檔中新增Windows service的Nullable屬性

設定 Windows Service

在 Program.cs 檔案中,我們新增了 UseWindowsService() 並設定了 ServiceName 為 ServiceSample1 , services.AddHostedService<Worker1>() ,指定了Worker的運行環境,由 Worker1 來設定 Worker 選項及生命週期事件(例如:設定 Worker 在收到關閉信號時進行優雅關閉)。

using Worker1;
using Microsoft.Extensions.Hosting;

IHost host = Host.CreateDefaultBuilder(args)
    .UseWindowsService(options => 
    { 
        options.ServiceName = "ServiceSample1"; 
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker1>();
    })
    .Build();

await host.RunAsync();

在 Worker1.cs 檔案中,我們可以定義 Worker 類別,在 ExecuteAsync() 方法中,可以實現主要的工作邏輯,stoppingToken 會在服務 StopAsync()時被呼叫。

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCancellationRequested)
    {
       _logger.LogInformation("Service running at: {time}", DateTime.Now);
       await Task.Delay(5000, stoppingToken);
    }
}

除了 ExecuteAsync() 外,也可以視需求override StartAsync()StopAsync() 方法來分別處理服務啟動即關閉時的邏輯。

除錯

Worker Service 專案的偵錯方式基本上跟 Console 專案是一樣的,直接 F5 開始偵錯即可,會顯示 Console 輸出 Log 訊息,另外因為 Worker Service 可以直接產出 .exe 的執行檔,所以也可以直接執行進行測試,之後安裝 Windows Service 也是直接利用產出的 .exe 執行檔進行喔。

發佈和安裝

完成程式碼的撰寫後,我們可以進行發佈並安裝 Windows Service。使用 dotnet CLI 或 Visual Studio 的發佈功能,將專案發佈為適用於 Windows 的執行檔。然後,使用命令提示字元以系統管理員權限執行以下命令安裝 Windows Service:

sc create <ServiceName> binPath= "<path to executable>"

啟動和管理 Windows Service

安裝完成後,可以使用以下命令啟動和管理 Windows Service:

sc start <ServiceName>   // 啟動服務
sc stop <ServiceName>    // 停止服務
sc delete <ServiceName>  // 刪除服務

使用 .NET 6 Worker 提供了更簡潔高效的方式來建立背景應用程式,不需要在像以前額外寫 Console 專案來進行除錯。在本篇文章中,我們介紹了建立 .NET 6 Worker 專案、設定 Windows Service、發佈和安裝 Windows Service 的步驟。希望這篇文章能幫助你快速上手開發 Windows Service,並將其應用於你的專案中。

參考資料

.NET 中的背景工作服務 | Microsoft Learn

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *