Thinkin Markdown

Worker Service 長時間服務託管

.NET Core 3 新功能

發佈時間 2020-04-13
閱讀時間 4 分鐘
主題 .NET Core
標籤
Worker Service

此篇文章主要帶大家利用 .NET Core 3.1 實作 Worker Service,有興趣就往下看吧!

Worker Service

介紹

Worker Service 是 .NET Core 3.0 新釋出的功能,官方也有釋出一專案範本(Template)供開發者去使用,讓開發者可以快速發展自己所需的背景服務

workerservice-0

Worker service project template

👉 一般來說 Worker Service 會被用來執行需要長時間處理定期需要做的事情!(其實就有點像 Windows 平台上的 Windows Service、Linux 平台上的 Daemon Service)

舉幾個例子:

  • 處理佇列(queue)上的訊息(message)或事件(event)
  • 偵測改變(ex. 檔案、物件···)並快速做出回應
  • 從各方資料來源彙總並利用
  • 從資料攝取管道(data ingestion pipeline)中擷取所需片段
  • 定期資料清理

⭐ 若搭配一些已有的排程套件(ex. Coravel),就可以讓 Worker Service 客製批次工作更加彈性化!

除上面所述之外,既然是從 .NET Core 衍生出來的功能,那它當然也有保留原有的那些被大幅簡化的特徵(日誌、依賴注入、組態設定···等等),好 Worker Service 不用嗎? (:3 ⌒゙)

基本使用步驟

初始化專案

1️⃣ 建立 global.json 檔案,將 .NET Core SDK 限定在 3.1.201 版本

dotnet new globaljson --sdk-version 3.1.201

2️⃣ 建立 WorkerServiceDemo 專案

dotnet new worker -n WorkerServiceDemo
cd WorkerServiceDemo

以上做完,最基本可運行的 Worker Service 就做完了,真的不唬 😎···

觀察專案結構

就是以 .NET Core 為基底的專案呀,不是錯覺 (◔౪◔)···

workerservice-1

Project structure

❗ 關鍵差在使用了 Microsoft.Extensions.Hosting 套件,考試會考很重要?!

💭 在 ASP.NET Core 中使用託管服務的背景工作

該套件含有 IHostedService 介面,後續會再提及該介面為什麼很關鍵~

···

先看 Worker 類別好了···

workerservice-3

Worker.cs

其實官方文件也描述得蠻清楚了,這個 BackgroundService 類別就是繼承了 IHostedServiceIDisposable 介面,則開發者一定要覆寫的方法為 ExecuteAsync ,其餘 StartAsyncStopAsyncDispose 等方法可視需求覆寫,但切記覆寫完最後依然要呼叫父類別方法哦!

💭 利用.NET Core中的Worker Service,来创建windows服务或linux守护程序

···

接著來看 Program 類別···

workerservice-2

Program.cs

需要於 ConfigureServices 中註冊所需的託管服務(有繼承 IHostedService 介面),以圖片為例就是 Worker 類別!

所以你/妳現在知道它的來龍去脈了嗎?當然若你/妳想了解更深入可以看看官方文件或已開源的程式碼唷~

轉換為 Windows Service (Optional)

那如果我們想把已經寫好的 Worker Service 轉換為可以在 Windows 執行的服務,該怎麼做呢?

只要於專案新增 Microsoft.Extensions.Hosting.WindowsServices 套件就行了···

dotnet add package Microsoft.Extensions.Hosting.WindowsServices

接著在 Program 類別 CreateHostBuilder 處加上 UseWindowsService(),完工!

workerservice-4

Add UseWindowsService()
···

部署為 Windows 服務的語法(透過 PowerShell)可參考如下:

# Build and Publish Application
dotnet build
dotnet publish -c Release -o "PathToPublish"

# Create ServiceName Service
sc.exe create ServiceName binpath="PathToPublishServiceName.exe"
  • PathToPublish:將專案發行的路徑位置
  • ServiceName:自定義服務名稱

語法執行完應該會類似如下圖,表示已建立了一個新服務:

workerservice-6

Windows Service

這邊在附上一些控制服務的語法(透過 PowerShell)可參考如下:

# Start ServiceName Service
sc.exe start ServiceName  

# Stop ServiceName Service
sc.exe stop ServiceName   

# Query ServiceName Service Status
sc.exe query ServiceName  

# Delete ServiceName Service
sc.exe delete ServiceName 
  • ServiceName:自定義服務名稱

轉換為 Linux Daemon Service(Optional)

那如果我們想把已經寫好的 Worker Service 轉換為可以在 Linux 執行的服務,該怎麼做呢?

只要於專案新增 Microsoft.Extensions.Hosting.Systemd 套件就行了···

dotnet add package Microsoft.Extensions.Hosting.Systemd

接著在 Program 類別 CreateHostBuilder 處加上 UseSystemd(),完工!

workerservice-5

Add UseSystemd()

部署為 Linux 服務的語法這部分我就沒有特別去深入了解了,之後有碰到我再回來補 😜···

範例專案

可參考範例專案···

參考

💭 Upgrade net core2.2 app to net core3.1 as worker service

💭 Introduction to Worker Services in .NET Core 3.0

💭 Creating a Worker Service in ASP .NET Core 3.0

💭 WHAT ARE .NET WORKER SERVICES?

💭 [NETCore] ASP.NET Core 3.0 Worker Service 搭配 Coravel 建立排程服務

結尾

因為自己本身平常幾乎都是在 Windows 上開發,所以對於 .NET 的 Windows Service 不是很陌生,但那時候就覺得要部署一個 Windows Service 怎麼這個麻煩 😩···

而且視專案狀況,有可能會很肥(佔硬碟容量),更何況是若管理不慎,甚至會影響整台主機效能!

我也是最近才知道 .NET Core 3 釋出的 Worker Service(去年就有了),好奇研究了一下,結果好像回不去了 😂···

Worker Service 簡單且省力,趕緊來試試看吧!

如果這篇文章對你有幫助,歡迎分享給更多人!

贊助支持

如果你喜歡我們的文章,或是這些內容對你有幫助,歡迎透過以下平台請我們喝杯咖啡,支持我們持續創作!

Ko-fi

作者

NE

Neil Tsai

樂於分享所見所聞所覺所知的全端工程師

留言功能需要 Cookie 授權

為了載入留言功能,我們需要您同意使用「功能性 Cookie」。您可以隨時在設定中調整。

免責聲明

本網站對於任何使用或引用本網站網頁資料引致之損失或損害,概不負責。本網站亦有權隨時刪除、暫停或編輯本網站所登載之各項資料,以維護本網站之權益。除法律有強制規定外,在任何情況下,本網站對於 (1) 使用或無法使用本網站之各項服務;(2) 經由本網站取得訊息或進行交易;(3) 第三人在本網站上之陳述或作為;以及 (4) 其他與本網站服務有關之事項所致生之任何直接、間接、附帶、特別、懲罰性或衍生性損害,一概不負賠償責任。

CopyRight © 2026 Thinkin Markdown