NetCore windowsService 看门狗应用程序

  public class DogService : BackgroundService
    {

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            return base.StartAsync(cancellationToken);
        }
        /// <summary>
        ///  每一秒执行一次
        /// </summary>
        /// <param name="stoppingToken"></param>
        /// <returns></returns>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                  StartService();
                  await Task.Delay(1000 * 60 , stoppingToken);
            }
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        { 
            return base.StopAsync(cancellationToken);
        }  

        private void StartService()
        {
            List<string> services = new List<string>() { "ChargRabbitService" };
            foreach (var item in services)
            {
                ServiceController service = new ServiceController(item);
                try
                {
                    if (service.Status != ServiceControllerStatus.Running)
                    {

                        service.Start();
                        service.WaitForStatus(ServiceControllerStatus.Running);

                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
            }  
        }
    }

main

    static class Program
    {
        static  void Main(string[] args)
        {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile("appsettings.json", true, true);
            var ConfigRoot = builder.Build();//根节点
            IServiceCollection Services = new ServiceCollection();
            
            Services.AddLogging(log => { log.AddConsole(); log.AddNLog(); log.SetMinimumLevel(LogLevel.Error); });  
            //  
            using (ServiceProvider provider = Services.BuildServiceProvider())
            {
                

            }
            CreateHostBuilder(args).Run();
        }

        public static IHost CreateHostBuilder(string[] args)
        {
            var builder = Host.CreateDefaultBuilder(args)
                 .ConfigureServices((hostContext, services) =>
                 {
                     services.AddHostedService<DogService>();
                 }).UseWindowsService();
            var host = builder.Build();

            return host;
        }
    }

将发布的exe 设置为 以管理员身份运行 【属性-安全】

2024-11-27更新

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using NLog.Extensions.Logging;
using Quartz;
using Quartz.Impl;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace RabbitDogService
{
    static class Program
    {
        static async Task Main(string[] args)
        {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile("appsettings.json", true, true);
            var ConfigRoot = builder.Build();//根节点
            IServiceCollection Services = new ServiceCollection();
            Services.AddLogging(log => { log.AddConsole(); log.AddNLog(); log.SetMinimumLevel(LogLevel.Error); });
            //  
            Services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();//注册ISchedulerFactory的实例。
            Services.AddScoped<QuartzService>();//注册 QuartzService 的实例。
            using (ServiceProvider provider = Services.BuildServiceProvider())
            {
                var service = provider.GetService<QuartzService>();
                await service.Restart();


            }
            CreateHostBuilder(args).Run();
        }

        public static IHost CreateHostBuilder(string[] args)
        {
            var builder = Host.CreateDefaultBuilder(args)
                 .ConfigureServices((hostContext, services) =>
                 {
                     services.AddHostedService<DogService>();
                 }).UseWindowsService();
            var host = builder.Build();

            return host;
        }
    }
}

 

和 dogServie

using Microsoft.Extensions.Hosting;
using swapCommon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace RabbitDogService
{
    public class DogService : BackgroundService
    { 
        public override Task StartAsync(CancellationToken cancellationToken)
        {
            if (!cancellationToken.IsCancellationRequested)
            { 
            }
            return base.StartAsync(cancellationToken);
        } 

        /// <summary>
        ///  每一秒执行一次
        /// </summary>
        /// <param name="stoppingToken"></param>
        /// <returns></returns>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                StartService();
                await Task.Delay(1000 * 60 * 15, stoppingToken);
            }
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        { 
            return base.StopAsync(cancellationToken);
        }

        private void StartService()
        { 
            var configService = ConfigCommon.GetConfig("Services");
            //Console.WriteLine(configService);
            var services = configService.Split(",").ToList();
            foreach (var item in services)
            {
                ServiceController service = new ServiceController(item);
                try
                {
                    if (service.Status != ServiceControllerStatus.Running)
                    { 
                        service.Start();
                        service.WaitForStatus(ServiceControllerStatus.Running);

                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
        }
    }
}

和定时重启

using Microsoft.Extensions.Logging;
using Quartz;
using swapCommon; 
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace RabbitDogService
{
    public class QuartzService
    {
        private readonly ISchedulerFactory _schedulerFactory;
        private IScheduler _scheduler;
        private readonly ILogger<QuartzService> logger;
        public QuartzService(ISchedulerFactory schedulerFactory, ILogger<QuartzService> logger)
        {
            _schedulerFactory = schedulerFactory;
            this.logger = logger;
        }
        public class RestartService : IJob
        { 
            public Task Execute(IJobExecutionContext context)
            {
                var server = ConfigCommon.GetConfig("ServerOptions:server");
                var configService = ConfigCommon.GetConfig("Services");
                //Console.WriteLine(configService);
                var services = configService.Split(",").ToList();
                 
                foreach (var item in services)
                {
                    ServiceController service = new ServiceController(item);
                    try
                    {
                        Console.WriteLine("开始执行");
                        if (service.Status != ServiceControllerStatus.Running)
                        {
                            Console.WriteLine("开始启动");
                            service.Start();
                            service.WaitForStatus(ServiceControllerStatus.Running);

                        }
                        else
                        { 
                            Console.WriteLine("开始停止");
                            service.Stop();
                            service.WaitForStatus(ServiceControllerStatus.Stopped);
                            Thread.Sleep(4500);
                            Console.WriteLine("停止完成后启动");
                            service.Start();
                            service.WaitForStatus(ServiceControllerStatus.Running);
                        }
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
                return Task.Run(() =>
                {
                     
                    Console.WriteLine("执行结束:");
                });
            }
        }
 

        public async Task Restart()
        {

            //通过调度工厂获得调度器
            _scheduler = await _schedulerFactory.GetScheduler();
            //开启调度器
            await _scheduler.Start();
            logger.LogError("调度器开始工作-断电");
            //创建一个触发器
            var trigger = TriggerBuilder.Create().StartNow().WithCronSchedule("0 08 23 ? * *") //每天17.59点断电

                .Build();
            //创建任务
            var jobDetail = JobBuilder.Create<RestartService>()
                .Build();
            //将触发器和任务器绑定到调度器中
            await _scheduler.ScheduleJob(jobDetail, trigger);
        }
         
    }
}

 

posted @ 2023-09-01 17:28  天才卧龙  阅读(71)  评论(0)    收藏  举报