diff --git a/.semver.txt b/.semver.txt
index 140333f..c2320f5 100644
--- a/.semver.txt
+++ b/.semver.txt
@@ -1 +1 @@
-1.0.19
+1.0.20
diff --git a/src/MonsterMonitor/MonsterMonitor.csproj b/src/MonsterMonitor/MonsterMonitor.csproj
index 240464c..950745e 100644
--- a/src/MonsterMonitor/MonsterMonitor.csproj
+++ b/src/MonsterMonitor/MonsterMonitor.csproj
@@ -6,10 +6,10 @@
7.3
MonsterMonitor
devenv
- 1.0.19
- 1.0.19
- 1.0.19
- 1.0.19
+ 1.0.20
+ 1.0.20
+ 1.0.20
+ 1.0.20
diff --git a/src/MonsterMonitor/Services/AppController.cs b/src/MonsterMonitor/Services/AppController.cs
index 58d27e2..32093e0 100644
--- a/src/MonsterMonitor/Services/AppController.cs
+++ b/src/MonsterMonitor/Services/AppController.cs
@@ -10,6 +10,7 @@ namespace MonsterMonitor.Services
private readonly SsConfigService _ssConfig;
private ProcessMonitorService _processMonitor;
private SshTunnelService _sshTunnel;
+ private IAuthMonitor _authMonitor;
public AppController(LogService log, PowerManagementService power)
{
@@ -25,10 +26,12 @@ namespace MonsterMonitor.Services
_power.PreventSleep();
_processMonitor = new ProcessMonitorService(_log);
_sshTunnel = new SshTunnelService(_log);
+ _authMonitor = new AuthMonitor(settings);
_ssConfig.EnsureConfig(settings);
_processMonitor.Start(settings.SsProcessPath, settings.SsArguments);
_sshTunnel.Start(settings);
+ _ = _authMonitor.StartMonitor();
_log.Info("Сервисы приложения запущены.");
}
@@ -38,6 +41,9 @@ namespace MonsterMonitor.Services
_sshTunnel?.Dispose();
_sshTunnel = null;
+ _authMonitor?.StopMonitor();
+ _authMonitor = null;
+
_processMonitor?.Dispose();
_processMonitor = null;
diff --git a/src/MonsterMonitor/Services/AuthMonitor.cs b/src/MonsterMonitor/Services/AuthMonitor.cs
index 06663b5..180520d 100644
--- a/src/MonsterMonitor/Services/AuthMonitor.cs
+++ b/src/MonsterMonitor/Services/AuthMonitor.cs
@@ -2,6 +2,7 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using MonsterMonitor.Models;
@@ -20,6 +21,8 @@ namespace MonsterMonitor.Services
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
private readonly AppSettings _settings;
+ private CancellationTokenSource _monitorCancellation;
+ private Task _monitorTask;
public AuthMonitor(AppSettings settings)
{
@@ -36,12 +39,39 @@ namespace MonsterMonitor.Services
public async Task StartMonitor()
{
- _ = Task.Run(async () => await CheckProcess());
+ StopMonitor();
+ _monitorCancellation = new CancellationTokenSource();
+ _monitorTask = Task.Run(async () => await CheckProcess(_monitorCancellation.Token));
+ await Task.CompletedTask;
}
- private async Task CheckProcess()
+ public void StopMonitor()
{
- while (true)
+ if (_monitorCancellation == null)
+ {
+ return;
+ }
+
+ _monitorCancellation.Cancel();
+ try
+ {
+ _monitorTask?.Wait(TimeSpan.FromSeconds(1));
+ }
+ catch
+ {
+ // Ignore shutdown errors.
+ }
+ finally
+ {
+ _monitorCancellation.Dispose();
+ _monitorCancellation = null;
+ _monitorTask = null;
+ }
+ }
+
+ private async Task CheckProcess(CancellationToken token)
+ {
+ while (!token.IsCancellationRequested)
{
try
{
@@ -70,7 +100,14 @@ namespace MonsterMonitor.Services
MessageBox.Show(ex.Message + ex.StackTrace);
}
- await Task.Delay(TimeSpan.FromSeconds(3));
+ try
+ {
+ await Task.Delay(TimeSpan.FromSeconds(3), token);
+ }
+ catch (TaskCanceledException)
+ {
+ break;
+ }
}
}
}
@@ -78,5 +115,6 @@ namespace MonsterMonitor.Services
public interface IAuthMonitor
{
Task StartMonitor();
+ void StopMonitor();
}
}