選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
6 分鐘閱讀時間 (1207 個字)

利用 .NET Core Worker Service 來建置背景服務吧!

Do Something Great Photo by Clark Tibbs on Unsplash

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

Worker Service

介紹

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

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️⃣ 建立 WorkerServiceDemo 專案

dotnet new worker -n WorkerServiceDemo
cd WorkerServiceDemo 
X

以上做完,最基本可運行的 Worker Service 就做完了,真的不唬(◔౪◔)...

2️⃣ 接著簡單運行一下看看!

dotnet run WorkerServiceDemo.csproj 
X

有看到以下畫面,就表示成功囉!

觀察專案結構

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

Project structure

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

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

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

. . .

先看 Worker 類別好了…

Worker.cs

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

. . .

接著來看 Program 類別…

Program.cs

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

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

轉換為 Windows Service (Optional)

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

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

dotnet add package Microsoft.Extensions.Hosting.WindowsServices 
X

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

Add UseWindowsService()

部署為 Windows 服務的語法可參考如下:

rem Build and Publish Application
dotnet build
dotnet publish -c Release -o "PathToPublish"
rem Create ServiceName Service
sc.exe create ServiceName binpath="PathToPublish\ServiceName.exe" 
X
  • PathToPublish:將專案發行的路徑位置
  • ServiceName:自定義服務名稱
語法執行完應該會類似如下圖,表示已建立了一個新服務:
Windows Service

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

rem Start ServiceName Service
sc.exe start ServiceName  
rem Stop ServiceName Service
sc.exe stop ServiceName   
rem Query ServiceName Service Status
sc.exe query ServiceName  
rem Delete ServiceName Service
sc.exe delete ServiceName  
X
  • ServiceName:自定義服務名稱

轉換為 Linux Daemon Service(Optional)

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

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

dotnet add package Microsoft.Extensions.Hosting.Systemd 
X

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

Add UseSystemd()

至於部署為 Linux 服務的語法這部分我就沒有特別去深入了解了,之後如果有碰到我可能再回來補囉...

範例專案

 可參考範例專案

參考

結尾

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

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

好奇研究了一下 .NET Core 3 釋出的 Worker Service,結果好像就回不去了_(:3 」∠ )_

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

本文章也曾發表於我的 Blog 中,歡迎到裡面查查我其他分享的文章哦!

每日小知識#7-volume的種類
版控遷移

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2025/05/28, 週三

Captcha 圖像