1、创建Worker Service项目
选择“创建新项目”,选择创建模板“Worker Service”,点击“下一步”,填写项目名称和选择项目存储位置,名称我命名“MyTestWokerService”,存储位置为“D:\4、WorkSpace\1==VisualStudio==”,
框架选择“.NET 6.0”,由于创建的本级Windows服务,所以不用启动Docker。直接点击“创建”。创建完成后的目录结构如图。

2、项目目录介绍
Program.cs是一个项目的总入口,该类的左右包括:
- 创建默认 IHostBuilder。
- 调用 ConfigureServices 以使用 AddHostedService 将 Worker 类添加为托管服务。
- 从生成器生成 IHost。
- 在运行应用的 host 实例上调用 Run。
Worker.cs是 BackgroundService 的子类,用于实现 IHostedService。 BackgroundService 是一个 abstract class,需要子类来实现 BackgroundService.ExecuteAsync(CancellationToken)。 在模板实现中,ExecuteAsync 每秒循环一次,记录当前日期和时间,直到进程收到取消信号。ILogger是默认加入的一个日志应用。
appsettings.json:项目运行时的公共配置。
appsettings.Development.json:开发环境的配置。
3、添加NuGet 包
为了与 .NET IHostedService 实现中的本机 Windows 服务互操作,需要安装 “Microsoft.Extensions.Hosting.WindowsServices NuGet” 包。安装方法为:右键点击项目,选择“管理 NuGet 程序包(N)...”,打开NuGet包管理器,在浏览中搜索“Microsoft.Extensions.Hosting.WindowsServices”,然后安装它。

4、创建自定义的业务服务程序
在项目下创建一个新的业务类文件,此处创建为“WriteLogFile.cs”,这个类用来写日志文件。该类的内容为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyTestWokerService
{
public class WriteLogFile
{
public void WriteLog(string str)
{
using System.IO.StreamWriter streamWriter = new("C:\\log.txt", true);
streamWriter.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff") + " ==== " + str);
}
}
}
5、重写 Worker 类
将 WriteLogFile与 ILogger 一起注入。 这两者都作为 private readonly 字段提供给类。 在 ExecuteAsync 方法中,WriteLogFile服务请求写一个执行时间为,并将其写入日志文件中。
并重写StartAsync和StopAsync方法。具体代码实现如下:
namespace MyTestWokerService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly WriteLogFile _writeLogFile;
public Worker(ILogger<Worker> logger, WriteLogFile writeLogFile)
{
_logger = logger;
_writeLogFile = writeLogFile;
}
//启动是执行
public override async Task StartAsync(CancellationToken cancellationToken)
{
_writeLogFile.WriteLog("启动时间为: " + DateTimeOffset.Now);
await base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_writeLogFile.WriteLog("执行时间为: "+ DateTimeOffset.Now);
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
//停止时执行
public override async Task StopAsync(CancellationToken cancellationToken)
{
_writeLogFile.WriteLog("停止时间为: " + DateTimeOffset.Now);
await base.StopAsync(cancellationToken);
}
}
}
6、重写 Program 类
要将该项目应用配置为Windows服务工作,需要重写Program 类,使用UseWindowsService方法来配置,服务名称设置为“My Test Service”,托管服务已针对依赖项注入注册。代码如下:
using MyTestWokerService;
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
//服务进行命名,会显示在Windows服务中的服务名称上
options.ServiceName = "My Test Service";
})
.ConfigureServices(services =>
{
//注入服务类
services.AddSingleton<WriteLogFile>();
services.AddHostedService<Worker>();
})
.Build();
await host.RunAsync();
7、启动调试服务
点击“调试”,启动服务,弹出任务启动框,可看出 _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);已执行打印,打开C盘中的log文件,看到也在打印我们写的内容。


8、 发布应用
若要将 .NET 服务应用创建为 Windows 服务,建议将应用作为单个可执行文件发布。 拥有一个独立式可执行文件不太容易出错,因为文件系统周围没有任何依赖文件。 但是你也可以选择其他发布形式,只要创建的 *.exe 文件可以作为 Windows 服务控制管理器的目标。
发布方法:右键单击“解决方案资源管理器”中的项目,选择“发布...”。然后,选择“添加发布配置文件”创建配置文件。 从“发布”对话框中,选择“文件夹”作为“目标”。然后选择发布的文件夹位置,默认的项目的bin的位置,我们这发布到D:\publish中,完成之后,点击“发布”。将编译应用,并将生成的 .exe 文件发布到 D:\publish输出目录。





9、创建 Windows 服务
若要创建 Windows 服务,请使用本机 Windows 服务控制管理器 (sc.exe) create 命令。 以管理员身份运行cmd。进入Windows服务中,可找到该服务。
sc.exe create "My Test Service" binpath="D:\publish\MyTestWokerService.exe"


10、启动服务
若要启动Windows服务,使用“sc.exe start”命令。
sc.exe start "My Test Service"
11、停止服务
若要停止Windows服务,使用“sc.exe stop”命令。
sc.exe stop "My Test Service"

12、删除Windows服务
若要删除 Windows 服务,请使用本机 Windows 服务控制管理器 “sc.exe delete” 命令。
sc.exe delete "My Test Service"

本文介绍了如何使用.NET 6.0创建Worker Service项目,详细步骤包括创建项目、理解项目结构、添加NuGet包、创建自定义业务服务、重写BackgroundService类以实现Windows服务功能,最后演示了如何发布、安装、启动、停止和删除Windows服务。


1000

被折叠的 条评论
为什么被折叠?



