在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。
概述
根據項目需求不同,創建長時間運行的服務的原因有很多,例如:
- 處理 CPU 密集型數據,比如文件檢索或圖片識別等。
- 在後臺對工作項進行排隊,比如:批量發送簡訊或郵件等操作。
- 按計劃執行基於時間的操作,比如:間隔2秒執行一次某操作。
後臺服務處理通常不涉及用戶界面 (UI),但可以圍繞它們來構建 UI。 在早期使用 .NET Framework 時,Windows 開發人員可能出於這些目的創建 Windows 服務。 現在通過 .NET,你可以使用 BackgroundService(它是 IHostedService 的實現)或實現自己的服務。
涉及知識點
在輔助角色服務中,許多術語被誤用為同義詞。 本文分定義了其中一些術語,以使其在本文中的意圖更為直觀。
- 後臺服務:BackgroundService 類型。
- 托管服務:IHostedService 的實現或 IHostedService 本身。
- 長時間運行的服務:持續運行的任何服務。
- Windows 服務:Windows 服務基礎結構,最初以 .NET Framework 為中心,但現在可通過 .NET 訪問。
- 輔助角色服務:輔助角色服務模板。
創建項目
1. 選擇模板
在Visual Studio開發工具中,新建項目,在項目模板中選擇“輔助角色服務”模板,然後點擊下一步,打開項目配置頁面,如下所示:
2. 配置新項目
在項目配置頁面,輸入項目名稱,位置,然後點擊下一步,所下所示:
3. 選擇框架
選擇輔助角色服務需要的框架,本示例選擇VisualStudio2022預設的.NET 6.0(長期支持)。不使用頂級語句,可根據具體情況進行勾選,建議勾上。如下圖所示:
項目結構
項目創建成功後,如下所示:
- 預設框架創建的輔助角色服務,自動添加了Microsoft.Extensions.Hosting包。
- Program 類,包含了程式入庫 main函數。在函數內註入了Worker服務。
- Worker表示一個後臺運行服務,繼承自BackgroundService,重寫ExecuteAsync方法,主要用於業務邏輯處理。
具體如下所示:
預設情況下,輔助角色模板不啟用伺服器垃圾回收 (GC),因為有很多因素決定了這樣做的必要性。 所有需要長時間運行服務的場景都應考慮此預設設置對性能的影響。 若要啟用伺服器 GC,將 ServerGarbageCollection
節點添加到項目文件:
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
註入組件
在本示例中,首先通過Nuget包管理器進行安裝,需要安裝的組件有兩個:
1. 採用後臺日誌記錄信息,需要安裝NLog對Microsoft.Extensions.Logging的擴展。
2. 因為本示例是需要部署成Windows服務,所以需要安裝Microsoft.Extensions.Hosting.WindowsServices。
Nuget包管理器頁面如下所示:
在Program中應用Windows服務,並註入NLog組件,如下所示:
using NLog.Extensions.Logging;
namespace DemoWorkerService
{
public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddLogging(logging =>
{
logging.AddNLog();
});
})
.Build();
host.Run();
}
}
}
輔助角色類
通過模板創建的項目中,預設提供了一下Worker類,此類是BackgroundService的派生類,主要提供StartAsync,ExecuteAsync,StopAsync三個方法可供重寫。如下所示:
namespace DemoWorkerService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Worker start at: {time}", DateTimeOffset.Now);
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Worker stop at: {time}", DateTimeOffset.Now);
return base.StopAsync(cancellationToken);
}
}
}
創建服務並運行
程式開發完成後,可根據實際項目需要打包到指定目錄下,然後通過服務管理器命令創建服務,如下所示:
以Windows平臺為例:
使用sc.exe工具來管理服務,輸入一下命令創建為windows服務
sc.exe create DemoWorkerService binPath=D:\Test\DemoWorkerService\DemoWorkerService.exe
DemoWorkerService 服務名稱
D:\Test\DemoWorkerService\DemoWorkerService.exe 生成的運行文件
查看服務狀態使用一下命令
sc.exe query DemoWorkerService
啟動命令
sc.exe start DemoWorkerService
可以通過命令行進行啟動服務,如下所示:
或者在服務管理視窗,選擇服務右鍵點擊啟動,如下所示:
註意:以上命令行視窗以管理員身份運行,否則可能會出現許可權不足的問題。
打開程式的運行目錄,可以看到日誌已正常運行,如下所示:
以上【.NET輔助角色服務入門簡介】的全部內容。
作者:老碼識途
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章