You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Pipe listener no longer fire-and-forgets via async void.App.StartPipeListener was an async-void method, meaning any exception escaping the loop would crash the process via the AppDomain handler. Renamed to StartPipeListenerAsync returning Task; OnStartup calls it as _ = StartPipeListenerAsync() so a stray exception flows through TaskScheduler.UnobservedTaskException (logged) instead of terminating the app.
StartupService — removed sync wrapper over async.SetEnabled (sync) was a thin wrapper around SetEnabledAsync using .GetAwaiter().GetResult(). The wrapper is gone; tests now call SetEnabledAsync directly via xUnit Task test methods.
Schtasks stderr read — replaced stderrTask.Wait(timeout) ? .GetAwaiter().GetResult() : "" with await stderrTask.WaitAsync(timeout) so the read is fully async with a clean timeout fallback.
Fixed
Privacy Toggles no longer write to the registry on every click. Toggling a switch now updates local state only; the user must press Apply to write pending changes. A live counter shows how many changes are pending, and Discard reverts them without touching the registry. Prevents accidental system changes when scrolling through the toggle list.
Dashboard no longer freezes on first load. Static system info (CPU, OS, RAM modules) is now loaded asynchronously instead of blocking the UI thread on a synchronous WMI capture. The Dashboard tab is responsive immediately on startup.
DNS / Hosts tab loads asynchronously. Reading the hosts file is now async (File.ReadAllLinesAsync); Refresh no longer freezes the UI on slow disks.
Icon cache eviction is now true FIFO. The icon cache previously evicted random entries because ConcurrentDictionary.Keys has no insertion-order guarantee. Frequently-used icons could be dropped while stale ones survived. The cache now tracks insertion order via a queue and evicts the oldest entries first when the size limit is reached.
SpeedTest output read — replaced Task.Result access after Task.WhenAll with proper await to remove the deadlock-prone pattern (the awaited tasks were already complete, but the style is now safe under all call paths).
Silent exception swallowing — empty catch { } blocks now log at Debug level so failures are diagnosable: ThemePopup custom-color parser, TemperatureService LibreHardwareMonitor close, WindowsUpdateService COM/RuntimeBinder catches in ExtractKbIds and ClassifyCategory.
Deep Cleanup — file/directory cleanup errors are now logged in addition to being added to the per-run error list, so unexpected I/O issues surface in the SysManager log.
Admin relaunch — RelaunchAsAdmin now distinguishes the user's UAC decline (Win32 error 1223 → Information) from real Win32 failures (Warning) and logs InvalidOperationException instead of swallowing it silently.
SHGetFileInfo P/Invoke — added SetLastError = true so callers can inspect the Win32 error code on failure.
Changed
PrivacyView toolbar — the Apply All button is replaced by Apply (writes only pending changes) and Discard (reverts to last-applied state). Both are disabled when no changes are pending. The Apply button uses the primary style to highlight the action.
PerformanceService.TakeSnapshotAsync XML doc now warns callers that the method must run before any state-modifying call; the recommended lazy-initialization pattern is documented inline.
PerformanceService.CreateRestorePointAsync comment reworded — the previous // BUG-003: marker was a design note, not an open bug; replaced with an explanation of why PowerShell AddParameter cannot be used here.
App.xaml.cs unhandled-exception dialog — added inline note explaining why MessageBox.Show is used instead of DialogService (the dispatcher exception may originate from DialogService itself).
.gitignore — added entries for local developer notes (.session-notes/, notes-local.md, scratch.md) so scratch files can never be tracked accidentally.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
SysManager 1.18.2 is out!
Download from GitHub Releases
[1.18.2] - 2026-06-03
Fixed
async void.App.StartPipeListenerwas an async-void method, meaning any exception escaping the loop would crash the process via the AppDomain handler. Renamed toStartPipeListenerAsyncreturningTask;OnStartupcalls it as_ = StartPipeListenerAsync()so a stray exception flows throughTaskScheduler.UnobservedTaskException(logged) instead of terminating the app.SetEnabled(sync) was a thin wrapper aroundSetEnabledAsyncusing.GetAwaiter().GetResult(). The wrapper is gone; tests now callSetEnabledAsyncdirectly via xUnitTasktest methods.stderrTask.Wait(timeout) ? .GetAwaiter().GetResult() : ""withawait stderrTask.WaitAsync(timeout)so the read is fully async with a clean timeout fallback.Fixed
File.ReadAllLinesAsync); Refresh no longer freezes the UI on slow disks.ConcurrentDictionary.Keyshas no insertion-order guarantee. Frequently-used icons could be dropped while stale ones survived. The cache now tracks insertion order via a queue and evicts the oldest entries first when the size limit is reached.Task.Resultaccess afterTask.WhenAllwith properawaitto remove the deadlock-prone pattern (the awaited tasks were already complete, but the style is now safe under all call paths).catch { }blocks now log at Debug level so failures are diagnosable: ThemePopup custom-color parser, TemperatureService LibreHardwareMonitor close, WindowsUpdateService COM/RuntimeBinder catches inExtractKbIdsandClassifyCategory.RelaunchAsAdminnow distinguishes the user's UAC decline (Win32 error 1223 → Information) from real Win32 failures (Warning) and logsInvalidOperationExceptioninstead of swallowing it silently.SHGetFileInfoP/Invoke — addedSetLastError = trueso callers can inspect the Win32 error code on failure.Changed
// BUG-003:marker was a design note, not an open bug; replaced with an explanation of why PowerShellAddParametercannot be used here.MessageBox.Showis used instead ofDialogService(the dispatcher exception may originate from DialogService itself)..gitignore— added entries for local developer notes (.session-notes/,notes-local.md,scratch.md) so scratch files can never be tracked accidentally.Verify the download
Expected SHA256:
880C6DFE5AFB9759DBDEAAFB863BB1F9B6C1620C1E7DA7EFFBBD4658E32313D4Beta Was this translation helpful? Give feedback.
All reactions