diff --git a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs index f42fb9b2e1..70c4685d07 100644 --- a/Source/NETworkManager/ViewModels/IPScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/IPScannerViewModel.cs @@ -440,6 +440,7 @@ private async Task Start() DragablzTabItem.SetTabHeader(_tabId, Host); + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); // Resolve hostnames diff --git a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs index 765b293a2b..70960638a0 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorHostViewModel.cs @@ -627,6 +627,7 @@ public async Task Start() IsStatusMessageDisplayed = false; IsRunning = true; + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); // Resolve hostnames diff --git a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs index f6a27d44a3..bbe3c3bdb8 100644 --- a/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs +++ b/Source/NETworkManager/ViewModels/PingMonitorViewModel.cs @@ -400,6 +400,7 @@ public void Start() // Reset chart ResetTimeChart(); + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); var ping = new Ping diff --git a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs index c4d0b75534..f683de1179 100644 --- a/Source/NETworkManager/ViewModels/PortScannerViewModel.cs +++ b/Source/NETworkManager/ViewModels/PortScannerViewModel.cs @@ -390,6 +390,7 @@ private async Task Start() DragablzTabItem.SetTabHeader(_tabId, Host); + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); // Resolve hostnames diff --git a/Source/NETworkManager/ViewModels/SNMPViewModel.cs b/Source/NETworkManager/ViewModels/SNMPViewModel.cs index dd2cf330fb..8119896d37 100644 --- a/Source/NETworkManager/ViewModels/SNMPViewModel.cs +++ b/Source/NETworkManager/ViewModels/SNMPViewModel.cs @@ -502,6 +502,7 @@ await DNSClientHelper.ResolveAorAaaaAsync(Host, ipAddress = dnsResult.Value; } + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); // SNMP... diff --git a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs index 4565094251..90af25696f 100644 --- a/Source/NETworkManager/ViewModels/TracerouteViewModel.cs +++ b/Source/NETworkManager/ViewModels/TracerouteViewModel.cs @@ -323,6 +323,7 @@ private async Task StartTrace() DragablzTabItem.SetTabHeader(_tabId, Host); + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = new CancellationTokenSource(); // Try to parse the string into an IP-Address diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index 480ee60f48..ead413f49f 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -110,6 +110,7 @@ Release date: **xx.xx.2025** ## Dependencies, Refactoring & Documentation +- Fixed `CancellationTokenSource` leak in `IPScanner`, `PortScanner`, `Traceroute`, `PingMonitor`, `PingMonitorHost` and `SNMP` ViewModels. The previous instance was never disposed before being overwritten on each run, leaking the underlying `WaitHandle`. [#3448](https://github.com/BornToBeRoot/NETworkManager/pull/3448) - Replace fire-and-forget `.ConfigureAwait(false)` calls with explicit discard assignments (`_ = SomeAsyncOperation()`) across command handlers, startup/load paths and profile callbacks. [#3441](https://github.com/BornToBeRoot/NETworkManager/pull/3441) - Code cleanup & refactoring - Language files updated via [#transifex](https://github.com/BornToBeRoot/NETworkManager/pulls?q=author%3Aapp%2Ftransifex-integration)