DnscryptProxyHostedService.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. /// DnscryptProxy后台服务
  10. /// </summary>
  11. sealed class DnscryptProxyHostedService : IHostedService
  12. {
  13. private readonly DnscryptProxyService dnscryptProxyService;
  14. private readonly ILogger<DnscryptProxyHostedService> logger;
  15. /// <summary>
  16. /// DnscryptProxy后台服务
  17. /// </summary>
  18. /// <param name="dnscryptProxyService"></param>
  19. /// <param name="logger"></param>
  20. public DnscryptProxyHostedService(
  21. DnscryptProxyService dnscryptProxyService,
  22. ILogger<DnscryptProxyHostedService> logger)
  23. {
  24. this.dnscryptProxyService = dnscryptProxyService;
  25. this.logger = logger;
  26. }
  27. /// <summary>
  28. /// 启动dnscrypt-proxy
  29. /// </summary>
  30. /// <param name="cancellationToken"></param>
  31. /// <returns></returns>
  32. public async Task StartAsync(CancellationToken cancellationToken)
  33. {
  34. try
  35. {
  36. await this.dnscryptProxyService.StartAsync(cancellationToken);
  37. this.logger.LogInformation($"{this.dnscryptProxyService}启动成功");
  38. // 监听意外退出
  39. var process = this.dnscryptProxyService.Process;
  40. if (process == null)
  41. {
  42. this.OnProcessExit(null, new EventArgs());
  43. }
  44. else
  45. {
  46. process.EnableRaisingEvents = true;
  47. process.Exited += this.OnProcessExit;
  48. }
  49. }
  50. catch (Exception ex)
  51. {
  52. this.logger.LogWarning($"{this.dnscryptProxyService}启动失败:{ex.Message}");
  53. }
  54. }
  55. /// <summary>
  56. /// 进程退出时
  57. /// </summary>
  58. /// <param name="sender"></param>
  59. /// <param name="e"></param>
  60. private void OnProcessExit(object? sender, EventArgs e)
  61. {
  62. if (this.dnscryptProxyService.ControllState != ControllState.Stopped)
  63. {
  64. this.logger.LogCritical($"{this.dnscryptProxyService}已意外停止,这将影响到{nameof(FastGithub)}解析域名的速度和准确性。");
  65. }
  66. }
  67. /// <summary>
  68. /// 停止dnscrypt-proxy
  69. /// </summary>
  70. /// <param name="cancellationToken"></param>
  71. /// <returns></returns>
  72. public Task StopAsync(CancellationToken cancellationToken)
  73. {
  74. try
  75. {
  76. this.dnscryptProxyService.Stop();
  77. this.logger.LogInformation($"{this.dnscryptProxyService}已停止");
  78. }
  79. catch (Exception ex)
  80. {
  81. this.logger.LogWarning($"{this.dnscryptProxyService}停止失败:{ex.Message}");
  82. }
  83. return Task.CompletedTask;
  84. }
  85. }
  86. }