среда, 29 июля 2026 г.

Qwen, AspireApp5, AspireApp1.slnx

Qwen, AspireApp5, AspireApp1.slnx

https://chat.qwen.ai/s/6cf3fa9a-7b98-4fd6-8e6c-0d6d0734c53e?fev=0.2.80

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.slnx

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.ApiService\AspireApp1.ApiService.csproj

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.AppHost\AspireApp1.AppHost.csproj

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.ServiceDefaults\AspireApp1.ServiceDefaults.csproj

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.Web\AspireApp1.Web.csproj

Исправлен

D:\Projects\VS02\2606\Aspire\VisualStudio\AspireApp5\AspireApp1.Web\Components\Pages\Home.razor

-------------------------------------------

🔑 Ключевые моменты решения

1. PeriodicTimer (.NET 6+)

Современный и эффективный способ организовать цикл:
_timer = new PeriodicTimer(TimeSpan.FromSeconds(_intervalSeconds)); while (await _timer.WaitForNextTickAsync(token)) { // выполняется каждые N секунд }
---------------------------------------

2. InvokeAsync(StateHasChanged)обязательно!

Таймер работает в фоновом потоке, а Blazor требует обновлять UI только в UI-потоке (synchronization context). Без InvokeAsync вы получите исключение или данные не отобразятся.

3. IAsyncDisposable — корректное завершение

Когда пользователь уходит со страницы (или приложение останавливается), DisposeAsync корректно останавливает таймер через CancellationToken. Без этого фоновый цикл продолжал бы работать и вызывать ошибки.

4. Разделение флагов _isLoading и _isRefreshing

  • _isLoading — для первичной загрузки (блокирует страницу)
  • _isRefreshing — для фоновых обновлений (показывает маленький спиннер в углу, данные не исчезают)

5. Устойчивость к ошибкам

Если запрос к API провалился (ApiService упал), цикл не останавливается — через N секунд будет предпринята новая попытка.
------------------------------------------------

🎨 Что получилось в UI

Элемент
Описание
🟢 LIVE badge
Пульсирующий индикатор, что автообновление активно
🔘 Свитч
Включение/выключение автообновления
📋 Селектор периода
3 / 5 / 10 / 30 / 60 секунд
🕐 Timestamp
Время последнего успешного обновления
🔄 Спиннер в углу таблицы
Показывается только во время фонового запроса
🔁 Кнопка "Обновить сейчас"
Ручное обновление вне зависимости от таймера

💡 Альтернатива: Streaming Rendering (продвинутый вариант)

В .NET 8+ есть ещё один элегантный подход — Streaming Rendering. Он позволяет стримить данные прямо в DOM по мере их поступления, без необходимости вручную управлять таймерами и StateHasChanged.
Но для вашего случая (постоянное обновление с настраиваемым интервалом) PeriodicTimer — самое подходящее и контролируемое решение.
----------

🚀 Запуск

  1. Сохраните файл
  2. Запустите приложение через AppHost (F5)
  3. Откроется страница — данные загрузятся автоматически
  4. Через 5 секунд (по умолчанию) таблица сама обновится с новыми случайными значениями
  5. Можете менять интервал или отключать автообновление в реальном времени
В Aspire Dashboard вы увидите регулярные запросы к /weatherforecast — это и есть работа цикла автообновления! 🎯


Комментариев нет:

Отправить комментарий