workserver是一种专门用来运行耗时服务所提供的一种项目模板
我们可以这样创建
完成后,安装nuget包 (一个是windows的系统服务,一个是linux的系统服务)
Install-Package Microsoft.Extensions.Hosting.WindowsServices
Install-Package Microsoft.Extensions.Hosting.Systemd
最后,我们的代码如下
Program
public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseWindowsService().UseSystemd().ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}
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}", DateTime.Now);Log($"Worker running at: {DateTime.Now}");await Task.Delay(1000, stoppingToken);}}private void Log(string data){using (StreamWriter sw = new StreamWriter("log.txt", true)){sw.WriteLine(data);}}}
直接运行
部署为服务运行
又增加两个bat脚本
install.bat
set current_path=%~dp0
sc create WorkerServiceDemo binPath= %current_path%WorkerServiceDemo.exe
sc config WorkerServiceDemo start= auto
sc start WorkerServiceDemo
uninstall.bat
sc stop WorkerServiceDemo
sc delete WorkerServiceDemo
然后,管理员方式执行 install.bat 进行安装启动服务。
使用 uninstall.bat 来卸载服务 。
执行服务后, 在系统服务里就有了我们的服务
日志也是正常输出的。
2022年3月31日
最近发现一个bug,就是后台服务的时候,环境地址是有问题的
建议使用以下方式 避免
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
另外 .NET Worker Service 如何优雅退出
依赖注入以下接口
IHostApplicationLifetime hostApplicationLifetime然后主动调用
this.hostApplicationLifetime.StopApplication();