diff --git a/SysManager/SysManager/Helpers/ObservableCollectionExtensions.cs b/SysManager/SysManager/Helpers/ObservableCollectionExtensions.cs
index d705bff..8be9eef 100644
--- a/SysManager/SysManager/Helpers/ObservableCollectionExtensions.cs
+++ b/SysManager/SysManager/Helpers/ObservableCollectionExtensions.cs
@@ -12,7 +12,7 @@ namespace SysManager.Helpers;
/// An that supports bulk replacement
/// with a single notification.
///
-public class BulkObservableCollection : ObservableCollection
+public sealed class BulkObservableCollection : ObservableCollection
{
private bool _suppressNotifications;
diff --git a/SysManager/SysManager/Services/ActivityLogService.cs b/SysManager/SysManager/Services/ActivityLogService.cs
index a831d00..8f3e476 100644
--- a/SysManager/SysManager/Services/ActivityLogService.cs
+++ b/SysManager/SysManager/Services/ActivityLogService.cs
@@ -26,7 +26,7 @@ public sealed class ActivityLogService
public IReadOnlyList GetRecent(int count = 5)
{
lock (_lock)
- return _entries.Take(count).ToList();
+ return _entries.Take(count).ToArray();
}
public void Log(string action, string detail)
diff --git a/SysManager/SysManager/Services/DnsService.cs b/SysManager/SysManager/Services/DnsService.cs
index 1465ffa..04ab411 100644
--- a/SysManager/SysManager/Services/DnsService.cs
+++ b/SysManager/SysManager/Services/DnsService.cs
@@ -114,7 +114,7 @@ public async Task> CaptureCurrentServersAsync(Cancellation
.Select(r => r?.ToString())
.Where(s => !string.IsNullOrWhiteSpace(s) && IPAddress.TryParse(s, out _))
.Select(s => s!)
- .ToList();
+ .ToArray();
}
finally { _gate.Release(); }
}
diff --git a/SysManager/SysManager/Services/LargeFileScanner.cs b/SysManager/SysManager/Services/LargeFileScanner.cs
index df70e60..0c675ac 100644
--- a/SysManager/SysManager/Services/LargeFileScanner.cs
+++ b/SysManager/SysManager/Services/LargeFileScanner.cs
@@ -133,7 +133,7 @@ private static IReadOnlyList Scan(
}
progress?.Report(new LargeFileProgress(scanned, bytesScanned, "Done"));
- return heap.Reverse().Select(h => meta[h.Path]).ToList();
+ return heap.Reverse().Select(h => meta[h.Path]).ToArray();
}
private static bool ShouldSkip(string path)
diff --git a/SysManager/SysManager/Services/PingMonitorService.cs b/SysManager/SysManager/Services/PingMonitorService.cs
index e3f0b5b..8a0f411 100644
--- a/SysManager/SysManager/Services/PingMonitorService.cs
+++ b/SysManager/SysManager/Services/PingMonitorService.cs
@@ -91,7 +91,7 @@ static TimeSpan Clamp(TimeSpan t) =>
foreach (var target in active)
_ = PingOnceAsync(target, ct);
- try { await Task.Delay(Clamp(Interval), ct); }
+ try { await Task.Delay(Clamp(Interval), ct).ConfigureAwait(false); }
catch (OperationCanceledException) { return; }
}
}
diff --git a/SysManager/SysManager/Services/SpeedTestService.cs b/SysManager/SysManager/Services/SpeedTestService.cs
index 911318e..be9e28c 100644
--- a/SysManager/SysManager/Services/SpeedTestService.cs
+++ b/SysManager/SysManager/Services/SpeedTestService.cs
@@ -95,7 +95,7 @@ private static async Task MeasureDownloadAsync(
}
});
- await Task.WhenAll(tasks);
+ await Task.WhenAll(tasks).ConfigureAwait(false);
sw.Stop();
var downloaded = Interlocked.Read(ref totalBytes);
diff --git a/SysManager/SysManager/Services/TracerouteMonitorService.cs b/SysManager/SysManager/Services/TracerouteMonitorService.cs
index 15b7bd8..879757b 100644
--- a/SysManager/SysManager/Services/TracerouteMonitorService.cs
+++ b/SysManager/SysManager/Services/TracerouteMonitorService.cs
@@ -100,7 +100,7 @@ private async Task PumpAsync(CancellationToken ct)
catch (InvalidOperationException) { /* traceroute failed for this target — skip */ }
}
- try { await Task.Delay(Interval, ct); }
+ try { await Task.Delay(Interval, ct).ConfigureAwait(false); }
catch (OperationCanceledException) { return; }
}
}