Visual Studio2022中使用.Net 8 在 Windows 下创建 Worker Service
- 1 什么是 .NET Core Worker Service
- 1.1 确认Visual Studio中安装了 ASP.NET和Web开发
- 2 创建 WorkerService项目
- 3 将应用转换成 Windows 服务
- 4. 发布
- 5 源代码分析
- 附:WTSGetActiveConsoleSessionId session 0
1 什么是 .NET Core Worker Service
Worker Service 是使用模板构建的 .NET 项目,该模板提供了一些有用的功能,可以将常规控制台应用程序变得更加强大。Worker Service 运行于宿主(Host)的概念之上,宿主维护应用程序的生命周期。宿主还提供了一些常见的特性,如依赖注入、日志记录和配置。
Worker Service 通常是长时间运行的服务,执行一些规律发生的工作负载。
1.1 确认Visual Studio中安装了 ASP.NET和Web开发
2 创建 WorkerService项目
2.1 新建一个WorkerService项目
2.2 项目结构说明
创建出来 Worker Service 项目包含以下文件:
文件 | 含义 |
---|---|
Program.cs | 控制台应用程序的入口点,启动时的“引导程序”。创建并运行宿主以管理应用程序生命周期并生成一个长期运行的服务。 |
appsettings.json | 一个提供应用程序配置值的 JSON 文件。 |
Worker.cs | 派生自 BackgroundService 基类,用于定义作为后台任务执行的长时间运行的工作负载。在这个文件中,你可以编写你的服务逻辑。 |
同时在依赖项的包中引入了Microsoft.Extensions.Hosting包。
3 将应用转换成 Windows 服务
为了将当前项目转换成服务的方式在windows上安装运行,也就是将 .NET Core 部署为 windows 服务,项目中需要引用 Microsoft.Extensions.Hosting.WindowsService
3.1 安装Microsoft.Extensions.Hosting.WindowsServices
- 方法1:在nuget包管理器的程序包管理器控制台中使用命令安装
安装nuget包
Install-Package Microsoft.Extensions.Hosting.WindowsServices
安装记录如下:
- 方法2:通过浏览查找添加
4. 发布
使用Visual Studio发布:
4.1 配置发布成单文件
配置发布目标
配置发布路径
完成后,点显示所有设置配置文件设置中选择部署方式:独立
设置文件发布选项:单文件
4.2 发布
- 点击发布按钮发布
- 使用命令行发布:
dotnet publish -r win-x64 -c Release // 打包成单文件 dotnet publish -r win-x86 -c release /p:publishsinglefile=true /p:publishtrimmed=true
使用SC命令在windows上安装服务
sc create GuardService BinPath=d:\GuardService.exe
使用SC命令设置服务自动启动
scconfig GuardService start=auto
使用SC命令在windows上删除服务
sc delete GuardService
SC其他操作服务的常用命令:启动、停止
sc start GuardService sc stop GuardService
5 源代码分析
Program.cs源代码
using GuardService; var builder = Host.CreateApplicationBuilder(args); builder.Services.AddHostedService<Worker>(); var host = builder.Build(); host.Run();
5.1 BackgroundService 类
BackgroundService 类实现了一个名为 IHostedService 的接口,为我们实现了 IHostedService。提供了三个可重写的方法,可以让我们绑定到应用程序的生命周期中。
5.1.1 抽象函数 ExecuteAsync:
作为应用程序主要入口点的方法。如果此方法退出,则应用程序将关闭。我们必须在 Worker 中实现它。默认情况下 Worker 只重写必要的抽象方法 ExecuteAsync。
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
5.1.2 虚函数 StartAsync:
在应用程序启动时调用。如果需要,可以重写此方法,它可用于在服务启动时一次性地设置资源;当然,也可以忽略它。
public virtual Task StartAsync(CancellationToken cancellationToken) { _stoppingCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); _executeTask = ExecuteAsync(_stoppingCts.Token); if (_executeTask.IsCompleted) { return _executeTask; } return Task.CompletedTask; }
5.1.3 虚函数 StopAsync:
在应用程序关闭时调用。如果需要,可以重写此方法,在关闭时释放资源和销毁对象;当然,也可以忽略它。
public virtual async Task