之前的文章已经写过了创建Windows服务。
C#创建Windows服务
不过之前使用的是.NET Framework创建的Windows服务。现在已经2023年了,其中vs2022有新的方法去创建Windows服务,本次使用.NET6创建Windows服务。
1.选择如图所示,其中vs2022这样的,vs2019不一样,但是都是worker service
2.创建完成是这样的
3.安装Microsoft.Extensions.Hosting.WindowsServices
这里注意版本,选择的是net6,好像只能安装6版本的。
nuget里面安装
4.服务命名,Program.cs文件
namespace WorkerServiceDemo { public class Program { public static void Main(string[] args) { IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService(options => { //给服务命名,在Windows服务中的会显示名字 options.ServiceName = "NET6故里2130"; }) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); host.Run(); } } }
5.服务里面写启动,停止,以及执行任务,Worker.cs中写
里面的业务就是,检测启动,停止,每次执行任务都输出
namespace WorkerServiceDemo { public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly string filePath = "D:\\Service1.txt"; public Worker(ILogger<Worker> logger) { _logger = logger; } /// <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); using (FileStream stream = new FileStream(filePath, FileMode.Append)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine($"{DateTimeOffset.Now},服务执行!"); } await Task.Delay(1000, stoppingToken); } } /// <summary> /// 服务启动 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task StartAsync(CancellationToken cancellationToken) { using (FileStream stream = new FileStream(filePath, FileMode.Append)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine($"{DateTime.Now},服务启动!"); } return base.StartAsync(cancellationToken); } /// <summary> /// 服务停止 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task StopAsync(CancellationToken cancellationToken) { using (FileStream stream = new FileStream(filePath, FileMode.Append)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine($"{DateTime.Now},服务停止!"); } return base.StopAsync(cancellationToken); } } }
6.效果
7.实际情况,我们肯定不是这么使用,但是这样调试肯定是可以的,接下来,我们安装此服务,变成Windows服务的样子,首选先进行发布
8.执行此命令
sc.exe create "故里2130" binpath="D:\code\WorkerService1\WorkerServiceDemo\bin\Release\net6.0\publish\WorkerServiceDemo.exe"
9.此时打开Windows服务,看到已经有了
10.现在就和正常的服务一样了,有开始,有停止,操作后,然后打开日志,可以看到服务的记录。