DnsInterceptHostedService.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Microsoft.Extensions.Hosting;
  2. using System.Collections.Generic;
  3. using System.Runtime.Versioning;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace FastGithub.Dns
  7. {
  8. /// <summary>
  9. /// dns拦截后台服务
  10. /// </summary>
  11. [SupportedOSPlatform("windows")]
  12. sealed class DnsInterceptHostedService : BackgroundService
  13. {
  14. private readonly DnsInterceptor dnsInterceptor;
  15. private readonly IEnumerable<IConflictSolver> conflictSolvers;
  16. /// <summary>
  17. /// dns拦截后台服务
  18. /// </summary>
  19. /// <param name="dnsInterceptor"></param>
  20. /// <param name="conflictSolvers"></param>
  21. public DnsInterceptHostedService(
  22. DnsInterceptor dnsInterceptor,
  23. IEnumerable<IConflictSolver> conflictSolvers)
  24. {
  25. this.dnsInterceptor = dnsInterceptor;
  26. this.conflictSolvers = conflictSolvers;
  27. }
  28. /// <summary>
  29. /// 启动时处理冲突
  30. /// </summary>
  31. /// <param name="cancellationToken"></param>
  32. /// <returns></returns>
  33. public override async Task StartAsync(CancellationToken cancellationToken)
  34. {
  35. foreach (var solver in this.conflictSolvers)
  36. {
  37. await solver.SolveAsync(cancellationToken);
  38. }
  39. await base.StartAsync(cancellationToken);
  40. }
  41. /// <summary>
  42. /// 停止时恢复冲突
  43. /// </summary>
  44. /// <param name="cancellationToken"></param>
  45. /// <returns></returns>
  46. public override async Task StopAsync(CancellationToken cancellationToken)
  47. {
  48. foreach (var solver in this.conflictSolvers)
  49. {
  50. await solver.RestoreAsync(cancellationToken);
  51. }
  52. await base.StopAsync(cancellationToken);
  53. }
  54. /// <summary>
  55. /// dns后台
  56. /// </summary>
  57. /// <param name="stoppingToken"></param>
  58. /// <returns></returns>
  59. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  60. {
  61. await Task.Yield();
  62. this.dnsInterceptor.Intercept(stoppingToken);
  63. }
  64. }
  65. }