[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

發佈留言

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