diff --git a/FastGithub.Dns.DnscryptProxy/ControllState.cs b/FastGithub.Dns.DnscryptProxy/ControllState.cs
new file mode 100644
index 0000000..5f76b18
--- /dev/null
+++ b/FastGithub.Dns.DnscryptProxy/ControllState.cs
@@ -0,0 +1,23 @@
+namespace FastGithub.Dns.DnscryptProxy
+{
+ ///
+ /// 服务控制状态
+ ///
+ enum ControllState
+ {
+ ///
+ /// 未控制
+ ///
+ None,
+
+ ///
+ /// 控制启动
+ ///
+ Started,
+
+ ///
+ /// 控制停止
+ ///
+ Stopped,
+ }
+}
diff --git a/FastGithub.Dns.DnscryptProxy/DnscryptProxyHostedService.cs b/FastGithub.Dns.DnscryptProxy/DnscryptProxyHostedService.cs
index 8106f45..eed208f 100644
--- a/FastGithub.Dns.DnscryptProxy/DnscryptProxyHostedService.cs
+++ b/FastGithub.Dns.DnscryptProxy/DnscryptProxyHostedService.cs
@@ -38,6 +38,18 @@ namespace FastGithub.Dns.DnscryptProxy
{
await this.dnscryptProxyService.StartAsync(cancellationToken);
this.logger.LogInformation($"{this.dnscryptProxyService}启动成功");
+
+ // 监听意外退出
+ var service = this.dnscryptProxyService.Process;
+ if (service == null)
+ {
+ this.OnProcessExit(null, new EventArgs());
+ }
+ else
+ {
+ service.EnableRaisingEvents = true;
+ service.Exited += this.OnProcessExit;
+ }
}
catch (Exception ex)
{
@@ -45,21 +57,18 @@ namespace FastGithub.Dns.DnscryptProxy
}
}
- /////
- ///// 后台监控
- /////
- /////
- /////
- //protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- //{
- // await Task.Yield();
-
- // this.dnscryptProxyService.Process?.WaitForExit();
- // if (this.isStopped == false)
- // {
- // this.logger.LogCritical($"{this.dnscryptProxyService}已停止运行,{nameof(FastGithub)}将无法解析域名。你可以把配置文件的{nameof(FastGithubOptions.PureDns)}修改为其它可用的DNS以临时使用。");
- // }
- //}
+ ///
+ /// 进程退出时
+ ///
+ ///
+ ///
+ private void OnProcessExit(object? sender, EventArgs e)
+ {
+ if (this.dnscryptProxyService.ControllState != ControllState.Stopped)
+ {
+ this.logger.LogCritical($"{this.dnscryptProxyService}已停止运行,{nameof(FastGithub)}将无法解析域名。你可以把配置文件的{nameof(FastGithubOptions.PureDns)}修改为其它可用的DNS以临时使用。");
+ }
+ }
///
/// 停止dnscrypt-proxy
diff --git a/FastGithub.Dns.DnscryptProxy/DnscryptProxyService.cs b/FastGithub.Dns.DnscryptProxy/DnscryptProxyService.cs
index ac20b6a..08305d6 100644
--- a/FastGithub.Dns.DnscryptProxy/DnscryptProxyService.cs
+++ b/FastGithub.Dns.DnscryptProxy/DnscryptProxyService.cs
@@ -19,6 +19,11 @@ namespace FastGithub.Dns.DnscryptProxy
///
public Process? Process { get; private set; }
+ ///
+ /// 获取服务控制状态
+ ///
+ public ControllState ControllState { get; private set; } = ControllState.None;
+
///
/// DnscryptProxy服务
///
@@ -35,6 +40,8 @@ namespace FastGithub.Dns.DnscryptProxy
///
public async Task StartAsync(CancellationToken cancellationToken)
{
+ this.ControllState = ControllState.Started;
+
var tomlPath = $"{name}.toml";
await TomlUtil.SetListensAsync(tomlPath, this.fastGithubConfig.PureDns, cancellationToken);
@@ -60,6 +67,8 @@ namespace FastGithub.Dns.DnscryptProxy
///
public void Stop()
{
+ this.ControllState = ControllState.Stopped;
+
if (OperatingSystem.IsWindows())
{
StartDnscryptProxy("-service stop")?.WaitForExit();