@@ -49,9 +49,6 @@ private void SetDataContexts()
4949 // Set DataContext for the association view
5050 this . AssociationView . DataContext = this . associationViewModel ;
5151
52- // Set DataContext for the performance view
53- this . PerformanceViewControl . DataContext = this . performanceViewModel ;
54-
5552 // Set DataContext for the log viewer view
5653 this . LogViewerViewControl . DataContext = this . logViewerViewModel ;
5754
@@ -340,15 +337,7 @@ private async Task LoadViewModelsAsync()
340337 await powerPlanTask ; // Ensure we get any exceptions
341338 this . LogDebug ( "PowerPlanViewModel loaded successfully" ) ;
342339
343- this . LogDebug ( "About to initialize PerformanceViewModel..." ) ;
344- var performanceTask = this . performanceViewModel . InitializeAsync ( ) ;
345- var performanceResult = await Task . WhenAny ( performanceTask , Task . Delay ( 5000 ) ) ;
346- if ( performanceResult != performanceTask )
347- {
348- throw new TimeoutException ( "PerformanceViewModel.InitializeAsync() timed out after 5 seconds" ) ;
349- }
350- await performanceTask ; // Ensure we get any exceptions
351- this . LogDebug ( "PerformanceViewModel initialized successfully" ) ;
340+ this . LogDebug ( "Skipping optional diagnostics initialization until the diagnostics page is opened." ) ;
352341
353342 this . LogDebug ( "About to load SystemTweaksViewModel..." ) ;
354343 var systemTweaksTask = this . systemTweaksViewModel . LoadCommand . ExecuteAsync ( null ) ;
@@ -1009,57 +998,7 @@ private async Task UpdateSystemTrayContextMenuAsync()
1009998 {
1010999 try
10111000 {
1012- // Update power plans in system tray
1013- var powerPlanService = this . serviceProvider . GetRequiredService < IPowerPlanService > ( ) ;
1014- var powerPlans = await powerPlanService . GetPowerPlansAsync ( ) ;
1015- var activePowerPlan = await powerPlanService . GetActivePowerPlan ( ) ;
1016- this . systemTrayService . UpdatePowerPlans ( powerPlans , activePowerPlan ) ;
1017-
1018- // Update profiles in system tray
1019- var profilesDirectory = StoragePaths . ProfilesDirectory ;
1020- var profileNames = new List < string > ( ) ;
1021-
1022- if ( Directory . Exists ( profilesDirectory ) )
1023- {
1024- profileNames = Directory . GetFiles ( profilesDirectory , "*.json" )
1025- . Select ( Path . GetFileNameWithoutExtension )
1026- . Where ( name => ! string . IsNullOrWhiteSpace ( name ) )
1027- . ToList ( ) ! ;
1028- }
1029-
1030- this . systemTrayService . UpdateProfiles ( profileNames ) ;
1031-
1032- // Update system status (with timeout to prevent hanging)
1033- try
1034- {
1035- var performanceService = this . serviceProvider . GetRequiredService < IPerformanceMonitoringService > ( ) ;
1036- var metricsTask = performanceService . GetSystemMetricsAsync ( lightweight : true ) ;
1037- var metricsResult = await Task . WhenAny ( metricsTask , Task . Delay ( 2000 ) ) ; // 2 second timeout
1038-
1039- if ( metricsResult == metricsTask )
1040- {
1041- var currentMetrics = await metricsTask ;
1042- this . systemTrayService . UpdateSystemStatus (
1043- activePowerPlan ? . Name ?? "Unknown" ,
1044- currentMetrics ? . TotalCpuUsage ?? 0.0 ,
1045- currentMetrics ? . MemoryUsagePercentage ?? 0.0 ) ;
1046- }
1047- else
1048- {
1049- // Timeout - use default values
1050- this . systemTrayService . UpdateSystemStatus (
1051- activePowerPlan ? . Name ?? "Unknown" ,
1052- 0.0 , 0.0 ) ;
1053- }
1054- }
1055- catch ( Exception metricsEx )
1056- {
1057- System . Diagnostics . Debug . WriteLine ( $ "Failed to get performance metrics for tray: { metricsEx . Message } ") ;
1058- // Use default values
1059- this . systemTrayService . UpdateSystemStatus (
1060- activePowerPlan ? . Name ?? "Unknown" ,
1061- 0.0 , 0.0 ) ;
1062- }
1001+ await this . systemTrayStatusUpdater . UpdateContextMenuAsync ( this . systemTrayService ) ;
10631002 }
10641003 catch ( Exception ex )
10651004 {
@@ -1073,6 +1012,12 @@ private void StartSystemTrayUpdateTimer()
10731012 {
10741013 this . systemTrayUpdateTimer ? . Stop ( ) ;
10751014 this . systemTrayUpdateTimer ? . Dispose ( ) ;
1015+ this . systemTrayUpdateTimer = null ;
1016+
1017+ if ( ! this . systemTrayStatusUpdater . ShouldRunPerformanceStatusUpdates )
1018+ {
1019+ return ;
1020+ }
10761021
10771022 this . systemTrayUpdateFailureStreak = 0 ;
10781023 this . systemTrayUpdateTimer = new System . Timers . Timer ( SystemTrayUpdateBaseIntervalMs ) ;
@@ -1150,21 +1095,9 @@ private async Task<bool> UpdateSystemTrayStatusAsync()
11501095 {
11511096 try
11521097 {
1153- var powerPlanService = this . serviceProvider . GetRequiredService < IPowerPlanService > ( ) ;
1154- var performanceService = this . serviceProvider . GetRequiredService < IPerformanceMonitoringService > ( ) ;
1155-
1156- var activePowerPlan = await powerPlanService . GetActivePowerPlan ( ) ;
1157- var currentMetrics = await performanceService . GetSystemMetricsAsync ( lightweight : true ) ;
1158-
1159- await this . Dispatcher . InvokeAsync ( ( ) =>
1160- {
1161- this . systemTrayService . UpdateSystemStatus (
1162- activePowerPlan ? . Name ?? "Unknown" ,
1163- currentMetrics ? . TotalCpuUsage ?? 0.0 ,
1164- currentMetrics ? . MemoryUsagePercentage ?? 0.0 ) ;
1165- } ) ;
1166-
1167- return true ;
1098+ return await this . systemTrayStatusUpdater . UpdateStatusAsync (
1099+ this . systemTrayService ,
1100+ action => this . Dispatcher . InvokeAsync ( action ) . Task ) ;
11681101 }
11691102 catch ( Exception ex )
11701103 {
@@ -1343,6 +1276,12 @@ private void ResumeForegroundRefreshes()
13431276 this . isSystemTrayUpdatesSuspended = false ;
13441277 this . systemTrayUpdateFailureStreak = 0 ;
13451278 this . systemTrayUpdateTimer ? . Stop ( ) ;
1279+
1280+ if ( ! this . systemTrayStatusUpdater . ShouldRunPerformanceStatusUpdates )
1281+ {
1282+ return ;
1283+ }
1284+
13461285 if ( this . systemTrayUpdateTimer != null )
13471286 {
13481287 this . systemTrayUpdateTimer . Interval = SystemTrayUpdateBaseIntervalMs ;
@@ -1365,8 +1304,13 @@ private void ResumeForegroundRefreshes()
13651304
13661305 private AppActivityState GetForegroundActivityState ( )
13671306 {
1368- return this . ProcessManagementTab . Visibility == Visibility . Visible
1369- ? AppActivityState . ForegroundProcessView
1307+ if ( this . ProcessManagementTab . Visibility == Visibility . Visible )
1308+ {
1309+ return AppActivityState . ForegroundProcessView ;
1310+ }
1311+
1312+ return this . PerformanceViewControl . Visibility == Visibility . Visible
1313+ ? AppActivityState . ForegroundDiagnosticsView
13701314 : AppActivityState . ForegroundOtherTab ;
13711315 }
13721316
@@ -1408,9 +1352,9 @@ private void ApplyAppRefreshPolicy(AppActivityState state)
14081352
14091353 if ( decision . PerformanceUiMonitoringEnabled )
14101354 {
1411- _ = this . performanceViewModel . ResumeBackgroundMonitoringAsync ( ) ;
1355+ _ = this . GetPerformanceViewModel ( ) . ActivateDiagnosticsAsync ( ) ;
14121356 }
1413- else
1357+ else if ( this . performanceViewModel != null )
14141358 {
14151359 _ = this . performanceViewModel . SuspendBackgroundMonitoringAsync ( ) ;
14161360 }
@@ -1541,6 +1485,11 @@ private void SelectMainTab(string tag)
15411485 return ;
15421486 }
15431487
1488+ if ( string . Equals ( tag , "Performance" , StringComparison . Ordinal ) )
1489+ {
1490+ this . GetPerformanceViewModel ( ) ;
1491+ }
1492+
15441493 this . ApplySectionVisibility ( tag ) ;
15451494
15461495 if ( string . Equals ( tag , "Performance" , StringComparison . Ordinal ) )
@@ -1791,9 +1740,14 @@ private void ApplySectionVisibility(string tag)
17911740 return ;
17921741 }
17931742
1794- this . ApplyAppRefreshPolicy ( string . Equals ( tag , "Process" , StringComparison . Ordinal )
1795- ? AppActivityState . ForegroundProcessView
1796- : AppActivityState . ForegroundOtherTab ) ;
1743+ var activityState = tag switch
1744+ {
1745+ "Process" => AppActivityState . ForegroundProcessView ,
1746+ "Performance" => AppActivityState . ForegroundDiagnosticsView ,
1747+ _ => AppActivityState . ForegroundOtherTab ,
1748+ } ;
1749+
1750+ this . ApplyAppRefreshPolicy ( activityState ) ;
17971751 }
17981752
17991753 private void NavMenuItem_Click ( object sender , RoutedEventArgs e )
@@ -1840,6 +1794,11 @@ private async Task NavMenuItem_ClickAsync(object sender, RoutedEventArgs e)
18401794 return ;
18411795 }
18421796
1797+ if ( string . Equals ( tag , "Performance" , StringComparison . Ordinal ) )
1798+ {
1799+ this . GetPerformanceViewModel ( ) ;
1800+ }
1801+
18431802 this . ApplySectionVisibility ( tag ) ;
18441803
18451804 if ( string . Equals ( tag , "Performance" , StringComparison . Ordinal ) )
@@ -1895,6 +1854,7 @@ protected override void OnClosed(EventArgs e)
18951854
18961855 this . initializationTimeoutTimer ? . Stop ( ) ;
18971856 this . initializationTimeoutTimer ? . Dispose ( ) ;
1857+ this . performanceViewModel ? . Dispose ( ) ;
18981858
18991859 this . selfResourceManagementService . RestoreForegroundMode ( ) ;
19001860 this . navigationBehavior . Dispose ( ) ;
0 commit comments