using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Threading; using System.Threading.Tasks; namespace FastGithub.DomainResolve { /// /// 域名解析后台服务 /// sealed class DomainResolveHostedService : BackgroundService { private readonly DnscryptProxy dnscryptProxy; private readonly DomainSpeedTester speedTester; private readonly ILogger logger; private readonly TimeSpan speedTestDueTime = TimeSpan.FromSeconds(10d); private readonly TimeSpan speedTestPeriod = TimeSpan.FromMinutes(2d); /// /// 域名解析后台服务 /// /// /// /// public DomainResolveHostedService( DnscryptProxy dnscryptProxy, DomainSpeedTester speedTester, ILogger logger) { this.dnscryptProxy = dnscryptProxy; this.speedTester = speedTester; this.logger = logger; } /// /// 停止时 /// /// /// public override async Task StopAsync(CancellationToken cancellationToken) { await this.speedTester.SaveDomainsAsync(); this.dnscryptProxy.Stop(); await base.StopAsync(cancellationToken); } /// /// 后台任务 /// /// /// 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); } } } }