DomainResolveHostedService.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Microsoft.Extensions.Hosting;
  2. using System;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. namespace FastGithub.DomainResolve
  6. {
  7. /// <summary>
  8. /// 域名解析后台服务
  9. /// </summary>
  10. sealed class DomainResolveHostedService : BackgroundService
  11. {
  12. private readonly DnscryptProxy dnscryptProxy;
  13. private readonly DomainSpeedTester speedTester;
  14. private readonly TimeSpan speedTestDueTime = TimeSpan.FromSeconds(10d);
  15. private readonly TimeSpan speedTestPeriod = TimeSpan.FromMinutes(2d);
  16. /// <summary>
  17. /// 域名解析后台服务
  18. /// </summary>
  19. /// <param name="dnscryptProxy"></param>
  20. /// <param name="speedTester"></param>
  21. public DomainResolveHostedService(
  22. DnscryptProxy dnscryptProxy,
  23. DomainSpeedTester speedTester)
  24. {
  25. this.dnscryptProxy = dnscryptProxy;
  26. this.speedTester = speedTester;
  27. }
  28. /// <summary>
  29. /// 后台任务
  30. /// </summary>
  31. /// <param name="stoppingToken"></param>
  32. /// <returns></returns>
  33. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  34. {
  35. await this.dnscryptProxy.StartAsync(stoppingToken);
  36. await Task.Delay(this.speedTestDueTime, stoppingToken);
  37. while (stoppingToken.IsCancellationRequested == false)
  38. {
  39. await this.speedTester.TestSpeedAsync(stoppingToken);
  40. await Task.Delay(this.speedTestPeriod, stoppingToken);
  41. }
  42. }
  43. /// <summary>
  44. /// 停止服务
  45. /// </summary>
  46. /// <param name="cancellationToken"></param>
  47. /// <returns></returns>
  48. public override Task StopAsync(CancellationToken cancellationToken)
  49. {
  50. this.dnscryptProxy.Stop();
  51. return base.StopAsync(cancellationToken);
  52. }
  53. }
  54. }