需求來源
在幾年前, 做的項目是依賴Windows服務來支撐一些業務, 目前已經把技術棧全部由.NET Framework 升級至 .NET Core x。
舊得需求大部分是,接入一些第三方得硬件設備, 例如PLC、串口讀卡器、TCP閱讀器、各種硬件模塊。
為了能夠讓任何開發語言接入無需重新實現, 所以使用Windows服務添加支持各類硬件API、對外使用MQTT.NET來進行協議開發。
版本更新
考慮到目前軟件的更新,其中包括安裝文件、SDK都是基於.NET Core, 所以使用Worker Service來創建服務, 該服務支持在Windows與Linux運行。
創建WorkerService
創建完成后, 整個默認項目包含Program以及一個Worker示例, 配置的模式與ASP.NET Core相同。
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
可以看到在配置服務中,AddHostedService添加了一個Worker, 類型約束IHostedService
關於Worker類的實現
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
- ExecuteAsync
在服務啟動時,會執行該方法,每秒鍾輸入當前時間
查看父類BackgroundService的實現,可以看到有支持重寫的方法。
public virtual void Dispose();
public virtual Task StartAsync(CancellationToken cancellationToken);
public virtual Task StopAsync(CancellationToken cancellationToken);
意思就是,我們可以在啟動服務時候觸發的邏輯以及暫停服務觸發的邏輯都可以自行編寫。
安裝服務
發布之后,即可使用sc.exe 來安裝/啟動/暫停/卸載服務等。
- 安裝服務
sc.exe create MyService binPath=C:\User\WorkerService.exe - 查詢服務狀態
sc.exe query MyService - 啟動服務
sc.exe start MyService - 暫停服務
sc.exe stop MyService - 卸載服務
sc.exe delete MyService
