From e8f3bd659f94f14bff4be32287059b9137f2526a Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Sat, 11 Apr 2026 20:37:04 -0400 Subject: [PATCH] Fix Dashboard auto-refresh stall: move _isRefreshing guard into LoadDataAsync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same class of bug as Lite (#824) — the timer tick handlers each managed the _isRefreshing flag redundantly. On a transient connection failure, MessageBox.Show blocked the UI thread while _isRefreshing remained true, causing every subsequent tick to skip silently. - Move _isRefreshing ownership into LoadDataAsync (matches Lite pattern) - Remove redundant guard from all 3 timer tick handlers - Suppress MessageBox during auto-refresh (fullRefresh: false) — log errors and update status bar instead of blocking the UI thread Co-Authored-By: Claude Opus 4.6 (1M context) --- Dashboard/ServerTab.xaml.cs | 93 +++++++++++++------------------------ 1 file changed, 33 insertions(+), 60 deletions(-) diff --git a/Dashboard/ServerTab.xaml.cs b/Dashboard/ServerTab.xaml.cs index a6eb9cf6..e858f38a 100644 --- a/Dashboard/ServerTab.xaml.cs +++ b/Dashboard/ServerTab.xaml.cs @@ -344,22 +344,7 @@ private void SetupAutoRefresh() }; _autoRefreshTimer.Tick += async (s, e) => { - if (_isRefreshing) return; - _isRefreshing = true; - - try - { - await LoadDataAsync(fullRefresh: false); - } - catch (Exception ex) - { - Logger.Error($"Error in auto-refresh: {ex.Message}", ex); - StatusText.Text = "Auto-refresh error"; - } - finally - { - _isRefreshing = false; - } + await LoadDataAsync(fullRefresh: false); }; _autoRefreshTimer.Start(); AutoRefreshToggle.IsChecked = true; @@ -415,22 +400,7 @@ public void RefreshAutoRefreshSettings() }; _autoRefreshTimer.Tick += async (s, e) => { - if (_isRefreshing) return; - _isRefreshing = true; - - try - { - await LoadDataAsync(fullRefresh: false); - } - catch (Exception ex) - { - Logger.Error($"Error in auto-refresh: {ex.Message}", ex); - StatusText.Text = "Auto-refresh error"; - } - finally - { - _isRefreshing = false; - } + await LoadDataAsync(fullRefresh: false); }; _autoRefreshTimer.Start(); AutoRefreshToggle.IsChecked = true; @@ -464,22 +434,7 @@ private void AutoRefreshToggle_Click(object sender, RoutedEventArgs e) }; _autoRefreshTimer.Tick += async (s, args) => { - if (_isRefreshing) return; - _isRefreshing = true; - - try - { - await LoadDataAsync(fullRefresh: false); - } - catch (Exception ex) - { - Logger.Error($"Error in auto-refresh: {ex.Message}", ex); - StatusText.Text = "Auto-refresh error"; - } - finally - { - _isRefreshing = false; - } + await LoadDataAsync(fullRefresh: false); }; _autoRefreshTimer.Start(); AutoRefreshToggle.Content = $"Auto-Refresh: {prefs.AutoRefreshIntervalSeconds}s"; @@ -1129,6 +1084,9 @@ private async Task ApplyAndRefreshCurrentTabAsync() /// private async Task LoadDataAsync(bool fullRefresh = true) { + if (_isRefreshing) return; + _isRefreshing = true; + using var _ = Helpers.MethodProfiler.StartTiming("ServerTab"); try { @@ -1139,12 +1097,19 @@ private async Task LoadDataAsync(bool fullRefresh = true) if (!connected) { StatusText.Text = $"Failed to connect to {_serverConnection.DisplayName}"; - MessageBox.Show( - $"Could not connect to SQL Server: {_serverConnection.ServerName}\n\nCheck connection settings", - "Connection Error", - MessageBoxButton.OK, - MessageBoxImage.Error - ); + if (fullRefresh) + { + MessageBox.Show( + $"Could not connect to SQL Server: {_serverConnection.ServerName}\n\nCheck connection settings", + "Connection Error", + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + else + { + Logger.Error($"Auto-refresh connection failed for {_serverConnection.DisplayName}"); + } return; } @@ -1167,16 +1132,24 @@ private async Task LoadDataAsync(bool fullRefresh = true) catch (Exception ex) { StatusText.Text = "Error loading data"; - MessageBox.Show( - $"Error loading data:\n\n{ex.Message}", - "Error", - MessageBoxButton.OK, - MessageBoxImage.Error - ); + if (fullRefresh) + { + MessageBox.Show( + $"Error loading data:\n\n{ex.Message}", + "Error", + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + else + { + Logger.Error($"Auto-refresh error for {_serverConnection.DisplayName}: {ex.Message}", ex); + } } finally { RefreshButton.IsEnabled = true; + _isRefreshing = false; } }