DomainResolveHostedService.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Microsoft.Extensions.Hosting;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace FastGithub.DomainResolve
  7. {
  8. /// <summary>
  9. /// 域名解析后台服务
  10. /// </summary>
  11. sealed class DomainResolveHostedService : BackgroundService
  12. {
  13. private readonly DnscryptProxy dnscryptProxy;
  14. private readonly IDomainResolver domainResolver;
  15. private readonly ILogger<DomainResolveHostedService> logger;
  16. private readonly TimeSpan dnscryptProxyInitDelay = TimeSpan.FromSeconds(5d);
  17. private readonly TimeSpan testPeriodTimeSpan = TimeSpan.FromSeconds(1d);
  18. /// <summary>
  19. /// 域名解析后台服务
  20. /// </summary>
  21. /// <param name="dnscryptProxy"></param>
  22. /// <param name="domainResolver"></param>
  23. public DomainResolveHostedService(
  24. DnscryptProxy dnscryptProxy,
  25. IDomainResolver domainResolver,
  26. ILogger<DomainResolveHostedService> logger)
  27. {
  28. this.dnscryptProxy = dnscryptProxy;
  29. this.domainResolver = domainResolver;
  30. this.logger = logger;
  31. }
  32. /// <summary>
  33. /// 后台任务
  34. /// </summary>
  35. /// <param name="stoppingToken"></param>
  36. /// <returns></returns>
  37. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  38. {
  39. try
  40. {
  41. await this.dnscryptProxy.StartAsync(stoppingToken);
  42. await Task.Delay(dnscryptProxyInitDelay, stoppingToken);
  43. while (stoppingToken.IsCancellationRequested == false)
  44. {
  45. await this.domainResolver.TestSpeedAsync(stoppingToken);
  46. await Task.Delay(this.testPeriodTimeSpan, stoppingToken);
  47. }
  48. }
  49. catch (OperationCanceledException)
  50. {
  51. }
  52. catch (Exception ex)
  53. {
  54. this.logger.LogError(ex, "域名解析异常");
  55. }
  56. }
  57. /// <summary>
  58. /// 停止服务
  59. /// </summary>
  60. /// <param name="cancellationToken"></param>
  61. /// <returns></returns>
  62. public override Task StopAsync(CancellationToken cancellationToken)
  63. {
  64. this.dnscryptProxy.Stop();
  65. return base.StopAsync(cancellationToken);
  66. }
  67. }
  68. }