编辑
2025-09-25
C#
00

目录

摘要
正文
Windows环境下部署服务

摘要

Worker Service是微软提供的一个项目模板,它基于BackgroundService并且可以在Windows和.NET Core平台上使用。通过使用Worker Service,开发者可以创建跨平台的服务,并且可以使用BackgroundService中的功能,如延迟任务执行和后台任务处理。使用Worker Service的优势在于,它可以轻松地与.NET Core应用程序集成,同时还可以提供可重用的后台任务功能,以帮助开发者更好地管理服务器上的任务。

正文

创建长时间运行的服务的原因有很多,例如:

  • 处理 CPU 密集型数据。
  • 在后台排队工作项。
  • 按计划执行基于时间的操作。

通常,后台服务不需要直接处理用户界面(UI),但可以围绕它们构建UI。在早期的 .NET Framework中,开发人员可以通过创建Windows服务来实现这一点。现在,有了 .NET,您可以使用 BackgroundService,它是 IHostedService 的实现,也可以实现自己的实现。

创建一个Worker Service 项目

image.png

个人习惯勾上Do not use top-level statements

项目创建好了,直接运行看看效果

在Program.cs中,CreateHostBuilder方法用于创建一个添加了Worker类作为托管服务的host,然后使用Build方法生成实例并调用Run方法来运行该实例。这与传统的控制台应用程序的结构类似。

C#
public class Program { public static void Main(string[] args) { IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); host.Run(); } }

我们再来看一下Worker类,继承了BackgroundService类

C#
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); } } }

BackgroundService类有几个虚方法

StartAsync会在服务开启时被调用

StopAsync则是在服务停止时被调用

ExecuteAsync是必须要被实现的方法,它定义了服务运行时需要执行的操作。

我们加载一下NLog

nuget 安装依赖

NLog

NLog.Extensions.Logging

修改Program,启用nLog

C#
using Microsoft.Extensions.DependencyInjection; using NLog.Extensions.Logging; namespace wsHello { public class Program { public static void Main(string[] args) { IHost host = Host.CreateDefaultBuilder(args) .ConfigureLogging((host, logging) => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" }); }) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); host.Run(); } } }

创建一个Plc类

C#
public class Plc { private readonly ILogger<Plc> _logger; public Plc(ILogger<Plc> logger) { _logger = logger; } public object Read() { _logger.LogInformation("读Plc信息"); return null; } }

修改注入

C#
public class Program { public static void Main(string[] args) { IHost host = Host.CreateDefaultBuilder(args) .ConfigureLogging((host, logging) => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" }); }) .ConfigureServices(services => { services.AddHostedService<Worker>(); services.AddSingleton<Plc>();//单例注入 }) .Build(); host.Run(); } }

修改Worker

C#
private readonly ILogger<Worker> _logger; private readonly Plc _plc; public Worker(ILogger<Worker> logger, Plc plc) { _logger = logger; _plc = plc; } /// <summary> /// 执行服务 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); _plc.Read(); await Task.Delay(1000, stoppingToken); } }

Windows环境下部署服务

说明命令
安装服务sc.exe create 服务名 binPath=路径
安装服务sc.exe delete 服务名
启动服务sc.exe start 服务名
停止服务sc.exe stop 服务名

为了执行这些命令,您需要使用管理员权限的CMD或PowerShell。

nuget 安装依赖

Microsoft.Extensions.Hosting.WindowsService

这里需要注意版本,我这用的.net 6,安装8.0会出错,我降到6.02版本没问题了。

修改Program

C#
public class Program { public static void Main(string[] args) { IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService()//注册服务 .ConfigureLogging((host, logging) => { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" }); }) .ConfigureServices(services => { services.AddHostedService<Worker>(); services.AddSingleton<Plc>();//单例注入 }) .Build(); host.Run(); } }

安装服务

C#
C:\Windows\System32>sc.exe create wshello binpath=D:\BaiduSyncdisk\11Test\wsHello\wsHello\bin\Debug\net6.0\wsHello.exe [SC] CreateService SUCCESS

在service中找一个这个服务

起动服务

删除服务

C#
C:\Windows\System32>sc.exe delete wshello [SC] DeleteService SUCCESS

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!