.net 5 windows 系统服务 workserver

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();

posted @ 2021-08-04 14:41  蓝创精英团队  阅读(3)  评论(0)    收藏  举报  来源