Skip to content

Commit ef8435a

Browse files
Fix Dashboard auto-refresh stall: move _isRefreshing guard into LoadDataAsync (#833)
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) <noreply@anthropic.com>
1 parent 564773a commit ef8435a

1 file changed

Lines changed: 33 additions & 60 deletions

File tree

Dashboard/ServerTab.xaml.cs

Lines changed: 33 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -344,22 +344,7 @@ private void SetupAutoRefresh()
344344
};
345345
_autoRefreshTimer.Tick += async (s, e) =>
346346
{
347-
if (_isRefreshing) return;
348-
_isRefreshing = true;
349-
350-
try
351-
{
352-
await LoadDataAsync(fullRefresh: false);
353-
}
354-
catch (Exception ex)
355-
{
356-
Logger.Error($"Error in auto-refresh: {ex.Message}", ex);
357-
StatusText.Text = "Auto-refresh error";
358-
}
359-
finally
360-
{
361-
_isRefreshing = false;
362-
}
347+
await LoadDataAsync(fullRefresh: false);
363348
};
364349
_autoRefreshTimer.Start();
365350
AutoRefreshToggle.IsChecked = true;
@@ -415,22 +400,7 @@ public void RefreshAutoRefreshSettings()
415400
};
416401
_autoRefreshTimer.Tick += async (s, e) =>
417402
{
418-
if (_isRefreshing) return;
419-
_isRefreshing = true;
420-
421-
try
422-
{
423-
await LoadDataAsync(fullRefresh: false);
424-
}
425-
catch (Exception ex)
426-
{
427-
Logger.Error($"Error in auto-refresh: {ex.Message}", ex);
428-
StatusText.Text = "Auto-refresh error";
429-
}
430-
finally
431-
{
432-
_isRefreshing = false;
433-
}
403+
await LoadDataAsync(fullRefresh: false);
434404
};
435405
_autoRefreshTimer.Start();
436406
AutoRefreshToggle.IsChecked = true;
@@ -464,22 +434,7 @@ private void AutoRefreshToggle_Click(object sender, RoutedEventArgs e)
464434
};
465435
_autoRefreshTimer.Tick += async (s, args) =>
466436
{
467-
if (_isRefreshing) return;
468-
_isRefreshing = true;
469-
470-
try
471-
{
472-
await LoadDataAsync(fullRefresh: false);
473-
}
474-
catch (Exception ex)
475-
{
476-
Logger.Error($"Error in auto-refresh: {ex.Message}", ex);
477-
StatusText.Text = "Auto-refresh error";
478-
}
479-
finally
480-
{
481-
_isRefreshing = false;
482-
}
437+
await LoadDataAsync(fullRefresh: false);
483438
};
484439
_autoRefreshTimer.Start();
485440
AutoRefreshToggle.Content = $"Auto-Refresh: {prefs.AutoRefreshIntervalSeconds}s";
@@ -1129,6 +1084,9 @@ private async Task ApplyAndRefreshCurrentTabAsync()
11291084
/// </summary>
11301085
private async Task LoadDataAsync(bool fullRefresh = true)
11311086
{
1087+
if (_isRefreshing) return;
1088+
_isRefreshing = true;
1089+
11321090
using var _ = Helpers.MethodProfiler.StartTiming("ServerTab");
11331091
try
11341092
{
@@ -1139,12 +1097,19 @@ private async Task LoadDataAsync(bool fullRefresh = true)
11391097
if (!connected)
11401098
{
11411099
StatusText.Text = $"Failed to connect to {_serverConnection.DisplayName}";
1142-
MessageBox.Show(
1143-
$"Could not connect to SQL Server: {_serverConnection.ServerName}\n\nCheck connection settings",
1144-
"Connection Error",
1145-
MessageBoxButton.OK,
1146-
MessageBoxImage.Error
1147-
);
1100+
if (fullRefresh)
1101+
{
1102+
MessageBox.Show(
1103+
$"Could not connect to SQL Server: {_serverConnection.ServerName}\n\nCheck connection settings",
1104+
"Connection Error",
1105+
MessageBoxButton.OK,
1106+
MessageBoxImage.Error
1107+
);
1108+
}
1109+
else
1110+
{
1111+
Logger.Error($"Auto-refresh connection failed for {_serverConnection.DisplayName}");
1112+
}
11481113
return;
11491114
}
11501115

@@ -1167,16 +1132,24 @@ private async Task LoadDataAsync(bool fullRefresh = true)
11671132
catch (Exception ex)
11681133
{
11691134
StatusText.Text = "Error loading data";
1170-
MessageBox.Show(
1171-
$"Error loading data:\n\n{ex.Message}",
1172-
"Error",
1173-
MessageBoxButton.OK,
1174-
MessageBoxImage.Error
1175-
);
1135+
if (fullRefresh)
1136+
{
1137+
MessageBox.Show(
1138+
$"Error loading data:\n\n{ex.Message}",
1139+
"Error",
1140+
MessageBoxButton.OK,
1141+
MessageBoxImage.Error
1142+
);
1143+
}
1144+
else
1145+
{
1146+
Logger.Error($"Auto-refresh error for {_serverConnection.DisplayName}: {ex.Message}", ex);
1147+
}
11761148
}
11771149
finally
11781150
{
11791151
RefreshButton.IsEnabled = true;
1152+
_isRefreshing = false;
11801153
}
11811154
}
11821155

0 commit comments

Comments
 (0)