瀏覽代碼

合并后台服务

陈国伟 3 年之前
父節點
當前提交
249ff7a081

+ 19 - 8
FastGithub.DomainResolve/DnscryptProxy.cs

@@ -116,19 +116,30 @@ namespace FastGithub.DomainResolve
         /// <summary>
         /// 停止dnscrypt-proxy
         /// </summary>
-        public void Stop()
+        /// <returns></returns>
+        public bool Stop()
         {
-            if (OperatingSystem.IsWindows())
+            try
             {
-                StartDnscryptProxy("-service stop")?.WaitForExit();
-                StartDnscryptProxy("-service uninstall")?.WaitForExit();
+                if (OperatingSystem.IsWindows())
+                {
+                    StartDnscryptProxy("-service stop")?.WaitForExit();
+                    StartDnscryptProxy("-service uninstall")?.WaitForExit();
+                }
+                if (this.process != null && this.process.HasExited == false)
+                {
+                    this.process.Kill();
+                }
+                return true;
             }
-
-            if (this.process != null && this.process.HasExited == false)
+            catch (Exception)
             {
-                this.process.Kill();
+                return false;
+            }
+            finally
+            {
+                this.LocalEndPoint = null;
             }
-            this.LocalEndPoint = null;
         }
 
         /// <summary>

+ 0 - 65
FastGithub.DomainResolve/DnscryptProxyHostedService.cs

@@ -1,65 +0,0 @@
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace FastGithub.DomainResolve
-{
-    /// <summary>
-    /// DnscryptProxy后台服务
-    /// </summary>
-    sealed class DnscryptProxyHostedService : BackgroundService
-    {
-        private readonly ILogger<DnscryptProxyHostedService> logger;
-        private readonly DnscryptProxy dnscryptProxy;
-
-        /// <summary>
-        /// DnscryptProxy后台服务
-        /// </summary>
-        /// <param name="dnscryptProxy"></param>
-        /// <param name="logger"></param>
-        public DnscryptProxyHostedService(
-            DnscryptProxy dnscryptProxy,
-            ILogger<DnscryptProxyHostedService> logger)
-        {
-            this.dnscryptProxy = dnscryptProxy;
-            this.logger = logger;
-        }
-
-        /// <summary>
-        /// 启动dnscrypt-proxy
-        /// </summary>
-        /// <param name="stoppingToken"></param>
-        /// <returns></returns>
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
-        {
-            try
-            {
-                await this.dnscryptProxy.StartAsync(stoppingToken);
-            }
-            catch (Exception ex)
-            {
-                this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
-            }
-        }
-
-        /// <summary>
-        /// 停止dnscrypt-proxy
-        /// </summary>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public override Task StopAsync(CancellationToken cancellationToken)
-        {
-            try
-            {
-                this.dnscryptProxy.Stop();
-            }
-            catch (Exception ex)
-            {
-                this.logger.LogWarning($"{this.dnscryptProxy}停止失败:{ex.Message}");
-            }
-            return base.StopAsync(cancellationToken);
-        }
-    }
-}

+ 74 - 0
FastGithub.DomainResolve/DomainResolveHostedService.cs

@@ -0,0 +1,74 @@
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FastGithub.DomainResolve
+{
+    /// <summary>
+    /// 域名解析后台服务
+    /// </summary>
+    sealed class DomainResolveHostedService : BackgroundService
+    {
+        private readonly DnscryptProxy dnscryptProxy;
+        private readonly DomainSpeedTester speedTester;
+        private readonly ILogger<DomainResolveHostedService> logger;
+
+        private readonly TimeSpan speedTestDueTime = TimeSpan.FromSeconds(10d);
+        private readonly TimeSpan speedTestPeriod = TimeSpan.FromMinutes(2d);
+
+        /// <summary>
+        /// 域名解析后台服务
+        /// </summary>
+        /// <param name="dnscryptProxy"></param>
+        /// <param name="speedTester"></param>
+        /// <param name="logger"></param>
+        public DomainResolveHostedService(
+            DnscryptProxy dnscryptProxy,
+            DomainSpeedTester speedTester,
+            ILogger<DomainResolveHostedService> logger)
+        {
+            this.dnscryptProxy = dnscryptProxy;
+            this.speedTester = speedTester;
+            this.logger = logger;
+        }
+
+        /// <summary>
+        /// 停止时
+        /// </summary>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public override async Task StopAsync(CancellationToken cancellationToken)
+        {
+            await this.speedTester.SaveDomainsAsync();
+            this.dnscryptProxy.Stop();
+            await base.StopAsync(cancellationToken);
+        }
+
+        /// <summary>
+        /// 后台任务
+        /// </summary>
+        /// <param name="stoppingToken"></param>
+        /// <returns></returns>
+        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+        {
+            try
+            {
+                await this.dnscryptProxy.StartAsync(stoppingToken);
+            }
+            catch (Exception ex)
+            {
+                this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
+            }
+
+            await Task.Delay(this.speedTestDueTime, stoppingToken);
+            await this.speedTester.LoadDomainsAsync(stoppingToken);
+            while (stoppingToken.IsCancellationRequested == false)
+            {
+                await this.speedTester.TestSpeedAsync(stoppingToken);
+                await Task.Delay(this.speedTestPeriod, stoppingToken);
+            }
+        }
+    }
+}

+ 6 - 6
FastGithub.DomainResolve/DomainResolver.cs

@@ -13,19 +13,19 @@ namespace FastGithub.DomainResolve
     sealed class DomainResolver : IDomainResolver
     {
         private readonly DnsClient dnsClient;
-        private readonly DomainSpeedTestService speedTestService;
+        private readonly DomainSpeedTester speedTester;
 
         /// <summary>
         /// 域名解析器
         /// </summary>
         /// <param name="dnsClient"></param>
-        /// <param name="speedTestService"></param>
+        /// <param name="speedTester"></param>
         public DomainResolver(
             DnsClient dnsClient,
-            DomainSpeedTestService speedTestService)
+            DomainSpeedTester speedTester)
         {
             this.dnsClient = dnsClient;
-            this.speedTestService = speedTestService;
+            this.speedTester = speedTester;
         }
 
         /// <summary>
@@ -51,7 +51,7 @@ namespace FastGithub.DomainResolve
         /// <returns></returns>
         public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
         {
-            var addresses = this.speedTestService.GetIPAddresses(domain);
+            var addresses = this.speedTester.GetIPAddresses(domain);
             if (addresses.Length > 0)
             {
                 foreach (var address in addresses)
@@ -61,7 +61,7 @@ namespace FastGithub.DomainResolve
             }
             else
             {
-                this.speedTestService.Add(domain);
+                this.speedTester.Add(domain);
                 await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken))
                 {
                     yield return address;

+ 0 - 61
FastGithub.DomainResolve/DomainSpeedTestHostedService.cs

@@ -1,61 +0,0 @@
-using Microsoft.Extensions.Hosting;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace FastGithub.DomainResolve
-{
-    /// <summary>
-    /// 域名的IP测速后台服务
-    /// </summary>
-    sealed class DomainSpeedTestHostedService : BackgroundService
-    {
-        private readonly DomainSpeedTestService speedTestService;
-        private readonly TimeSpan testDueTime = TimeSpan.FromMinutes(1d);
-
-        /// <summary>
-        /// 域名的IP测速后台服务
-        /// </summary>
-        /// <param name="speedTestService"></param>
-        public DomainSpeedTestHostedService(DomainSpeedTestService speedTestService)
-        {
-            this.speedTestService = speedTestService;
-        }
-
-        /// <summary>
-        /// 启动时
-        /// </summary>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public override async Task StartAsync(CancellationToken cancellationToken)
-        {
-            await this.speedTestService.LoadDataAsync(cancellationToken);
-            await base.StartAsync(cancellationToken);
-        }
-
-        /// <summary>
-        /// 停止时
-        /// </summary>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public override async Task StopAsync(CancellationToken cancellationToken)
-        {
-            await this.speedTestService.SaveDataAsync();
-            await base.StopAsync(cancellationToken);
-        }
-
-        /// <summary>
-        /// 后台测速
-        /// </summary>
-        /// <param name="stoppingToken"></param>
-        /// <returns></returns>
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
-        {
-            while (stoppingToken.IsCancellationRequested == false)
-            {
-                await this.speedTestService.TestSpeedAsync(stoppingToken);
-                await Task.Delay(this.testDueTime, stoppingToken);
-            }
-        }
-    }
-}

+ 10 - 10
FastGithub.DomainResolve/DomainSpeedTestService.cs → FastGithub.DomainResolve/DomainSpeedTester.cs

@@ -13,9 +13,9 @@ namespace FastGithub.DomainResolve
     /// <summary>
     /// 域名的IP测速服务
     /// </summary>
-    sealed class DomainSpeedTestService
+    sealed class DomainSpeedTester
     {
-        private const string DATA_FILE = "domains.json";
+        private const string DOMAINS_JSON_FILE = "domains.json";
         private readonly DnsClient dnsClient;
 
         private readonly object syncRoot = new();
@@ -25,7 +25,7 @@ namespace FastGithub.DomainResolve
         /// 域名的IP测速服务
         /// </summary>
         /// <param name="dnsClient"></param>
-        public DomainSpeedTestService(DnsClient dnsClient)
+        public DomainSpeedTester(DnsClient dnsClient)
         {
             this.dnsClient = dnsClient;
         }
@@ -61,18 +61,18 @@ namespace FastGithub.DomainResolve
         }
 
         /// <summary>
-        /// 加载数据
+        /// 加载域名数据
         /// </summary>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task LoadDataAsync(CancellationToken cancellationToken)
+        public async Task LoadDomainsAsync(CancellationToken cancellationToken)
         {
-            if (File.Exists(DATA_FILE) == false)
+            if (File.Exists(DOMAINS_JSON_FILE) == false)
             {
                 return;
             }
 
-            using var fileStream = File.OpenRead(DATA_FILE);
+            using var fileStream = File.OpenRead(DOMAINS_JSON_FILE);
             var domains = await JsonSerializer.DeserializeAsync<string[]>(fileStream, cancellationToken: cancellationToken);
             if (domains == null)
             {
@@ -89,10 +89,10 @@ namespace FastGithub.DomainResolve
         }
 
         /// <summary>
-        /// 保存数据
+        /// 保存域名数据
         /// </summary>
         /// <returns></returns>
-        public async Task<bool> SaveDataAsync()
+        public async Task<bool> SaveDomainsAsync()
         {
             var domains = this.domainIPAddressHashSet.Keys
                 .Select(item => new DomainPattern(item))
@@ -102,7 +102,7 @@ namespace FastGithub.DomainResolve
 
             try
             {
-                using var fileStream = File.OpenWrite(DATA_FILE);
+                using var fileStream = File.OpenWrite(DOMAINS_JSON_FILE);
                 await JsonSerializer.SerializeAsync(fileStream, domains, new JsonSerializerOptions { WriteIndented = true });
                 return true;
             }

+ 2 - 3
FastGithub.DomainResolve/ServiceCollectionExtensions.cs

@@ -18,10 +18,9 @@ namespace FastGithub
         {
             services.TryAddSingleton<DnsClient>();
             services.TryAddSingleton<DnscryptProxy>();
-            services.TryAddSingleton<DomainSpeedTestService>();
+            services.TryAddSingleton<DomainSpeedTester>();
             services.TryAddSingleton<IDomainResolver, DomainResolver>();
-            services.AddHostedService<DnscryptProxyHostedService>();
-            services.AddHostedService<DomainSpeedTestHostedService>();
+            services.AddHostedService<DomainResolveHostedService>();
             return services;
         }
     }