BUG: Page Agents lente à charger — boucle d'auto-refresh attendue dans OnInitializedAsync bloque le rendu initial #44

Closed
opened 2026-08-11 11:39:29 +02:00 by nonobis · 1 comment
Owner

Contexte

AllAgentsPage (src/Heimdall.Web/Components/Pages/Admin/AllAgentsPage.razor) et Dashboard.razor font await LoadData(); await StartAutoRefresh(); dans OnInitializedAsync. StartAutoRefresh est une boucle infinie (while(!ct.IsCancellationRequested) { await Task.Delay(15s); ... }).

Observé

  • La page Agents (et le Dashboard) mettent longtemps à s'afficher
  • En SSR/prerender, le renderer attend la fin du cycle de vie du composant ; une boucle infinie awaitée dans OnInitializedAsync retarde le rendu initial (le « waiter »)
  • Même pattern dans CameraDetail.razor (vérifier)

Attendu

  • Le chargement initial de la page ne doit jamais être bloqué par la boucle d'auto-refresh
  • Le rendu initial se fait dès que les données initiales sont chargées

Correctif

  • Déplacer le démarrage de l'auto-refresh dans OnAfterRenderAsync(firstRender: true) (ou fire-and-forget non-awaité) sur Dashboard + AllAgentsPage (+ CameraDetail si même pattern)
  • Conserver l'annulation via Dispose (CTS) existante

Critères d'acceptation

  • Le premier rendu n'attend plus la boucle (tests : OnInitializedAsync retourne après LoadData)
  • Aucune régression des tests bUnit existants
  • make test vert
## Contexte `AllAgentsPage` (src/Heimdall.Web/Components/Pages/Admin/AllAgentsPage.razor) et `Dashboard.razor` font `await LoadData(); await StartAutoRefresh();` dans `OnInitializedAsync`. `StartAutoRefresh` est une **boucle infinie** (`while(!ct.IsCancellationRequested) { await Task.Delay(15s); ... }`). ## Observé - La page Agents (et le Dashboard) mettent longtemps à s'afficher - En SSR/prerender, le renderer attend la fin du cycle de vie du composant ; une boucle infinie awaitée dans `OnInitializedAsync` retarde le rendu initial (le « waiter ») - Même pattern dans `CameraDetail.razor` (vérifier) ## Attendu - Le chargement initial de la page ne doit jamais être bloqué par la boucle d'auto-refresh - Le rendu initial se fait dès que les données initiales sont chargées ## Correctif - Déplacer le démarrage de l'auto-refresh dans `OnAfterRenderAsync(firstRender: true)` (ou fire-and-forget non-awaité) sur Dashboard + AllAgentsPage (+ CameraDetail si même pattern) - Conserver l'annulation via Dispose (CTS) existante ## Critères d'acceptation - Le premier rendu n'attend plus la boucle (tests : OnInitializedAsync retourne après LoadData) - Aucune régression des tests bUnit existants - make test vert
Author
Owner

Corrigé par ba96c9b + ac6b17c. L'auto-refresh (boucle infinie) démarre désormais dans OnAfterRenderAsync(firstRender) au lieu d'être awaité dans OnInitializedAsync — le rendu initial (SSR/prerender) n'est plus bloqué. Appliqué à Dashboard, AllAgentsPage, CamerasPage, CameraDetail.

Corrigé par ba96c9b + ac6b17c. L'auto-refresh (boucle infinie) démarre désormais dans OnAfterRenderAsync(firstRender) au lieu d'être awaité dans OnInitializedAsync — le rendu initial (SSR/prerender) n'est plus bloqué. Appliqué à Dashboard, AllAgentsPage, CamerasPage, CameraDetail.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#44
No description provided.