Что такое отрисовщик в диспетчере задач
Перейти к содержимому

Что такое отрисовщик в диспетчере задач

  • автор:

Что такое отрисовщик в диспетчере задач

На этой неделе стала доступна новая сборка Windows 11 на канале для разработчиков. Она получила большое количество изменений, как полезных, так и не очень. Одним из изменений является новый диспетчер задач, инсайдеры заметили работу над ним ещё до выхода новой сборки, но только сейчас он выглядит завершённым, что позволяет подробно ознакомиться с некоторыми нововведениями.

Ресурс Deskmodder подчеркнул появление новой, более удобной реализации включения «эффективного режима» для любого процесса. На панели со списком запущенных процессов диспетчера задач теперь присутствует кнопка Efficiency mode. С помощью неё можно одним кликом снизить потребление вычислительных ресурсов процессом, а значит и его влияние на энергопотребление устройства. Efficiency mode заменяет «Эко-режим», который ранее был доступен в диспетчере задач только через контекстное меню. Выбор не сохраняется, режим эффективности необходимо включать после каждой перезагрузки приложения.

реклама

Также ресурс отметил увеличение количества фоновых процессов, присутствующих в диспетчере задач. Это связано с тем, что Microsoft объединила фоновые процессы и службы в одну категорию. На только что установленной системе единственным процессом в категории «Процессы Windows» сейчас является explorer.exe.

Форум русскоязычного сообщества Ubuntu

Страница сгенерирована за 0.053 секунд. Запросов: 24.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Отрисовка компонента Razor ASP.NET Core

Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.

Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

В этой статье приведены сведения об отрисовке компонентов Razor в приложениях ASP.NET Core Blazor, в том числе о том, когда следует вызывать StateHasChanged, чтобы вручную запустить отрисовку компонента.

Соглашения об отрисовке ComponentBase

Компоненты должны отрисовываться при первом добавлении в иерархию компонентов их родительским компонентом. Это единственный случай, когда отрисовка компонента обязательна. Компоненты могут отрисовываться в любых других случаях в соответствии с их собственной логикой и соглашениями.

По умолчанию компоненты Razor наследуются от базового класса ComponentBase, который содержит логику, вызывающую повторную отрисовку в следующие моменты времени:

  • После применения обновленного набора параметров из родительского компонента.
  • После применения обновленного значения для каскадного параметра.
  • После уведомления о событии и вызова одного из его собственных обработчиков событий.
  • После вызова собственного метода StateHasChanged (см. статью Жизненный цикл компонента Razor ASP.NET Core). Инструкции по предотвращению перезаписи дочерних параметров компонента при StateHasChanged вызове в родительском компоненте см. в статье «Избегайте перезаписи параметров в ASP.NET Core Blazor».

Компоненты, унаследованные от ComponentBase пропускают повторную отрисовку при обновлении параметров в том случае, если выполняется одно из следующих условий:

    Все параметры относятся к набору известных типов* или любому примитивному типу, который не изменился с момента установки предыдущего набора параметров. *Платформа Blazor использует набор встроенных правил и явным образом проверяет тип параметров для обнаружения изменений. Эти правила и типы могут быть изменены в любое время. Дополнительные сведения см. разделе API ChangeDetection в справочных материалах по ASP.NET Core.

Примечание. По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Управление потоком отрисовки

В большинстве случаев соглашения для ComponentBase определяют корректное подмножество повторных отрисовок компонента после наступления события. Разработчикам как правило не требуется предоставлять вручную логику, указывающую платформе, какие компоненты и когда следует повторно отрисовывать. В целом, соглашения для платформы определяют, что получающий событие компонент повторно отрисовывает себя. В этом случае инициируется рекурсивная повторная отрисовка компонентов-потомков, значения параметров которых могли измениться.

Дополнительные сведения о том, как соглашения для платформы влияют на производительность и как оптимизировать иерархию компонентов приложения для отрисовки, см. в статье Рекомендации по повышению производительности ASP.NET Core Blazor.

Потоковая отрисовка

Используйте потоковую отрисовку с отрисовкой на стороне статического сервера (статический SSR) или предварительной отрисовкой для потоковой передачи содержимого в потоке отклика и улучшения пользовательского интерфейса для компонентов, выполняющих длительные асинхронные задачи для полной отрисовки.

Например, рассмотрим компонент, который делает длительный запрос базы данных или вызов веб-API для отрисовки данных при загрузке страницы. Как правило, асинхронные задачи, выполняемые в процессе отрисовки компонента на стороне сервера, должны выполняться до отправки отрисованного ответа, что может отложить загрузку страницы. Любая существенная задержка при отрисовке страницы вредит пользовательскому интерфейсу. Чтобы улучшить взаимодействие с пользователем, потоковая отрисовка изначально отображает всю страницу с содержимым заполнителя во время асинхронных операций. После завершения операций обновленное содержимое отправляется клиенту в том же подключении ответа и исправлено в DOM.

Для потоковой отрисовки сервер должен избежать буферизации выходных данных. Данные ответа должны передаваться клиенту по мере создания данных. Для узлов, которые применяют буферизацию, потоковая отрисовка ухудшается корректно, а страница загружается без потоковой отрисовки.

Чтобы передавать обновления содержимого при использовании статической отрисовки на стороне сервера (статический SSR) или предварительной подготовки, примените [StreamRendering(true)] атрибут к компоненту. Потоковая отрисовка должна быть явно включена, так как потоковые обновления могут привести к перемещению содержимого на странице. Компоненты без атрибута автоматически принимают потоковую отрисовку, если родительский компонент использует эту функцию. Передайте false атрибут в дочернем компоненте, чтобы отключить функцию в этом моменте и далее вниз по поддереву компонента. Атрибут работает при применении к компонентам, предоставляемым библиотекой Razorклассов.

Следующий пример основан на Weather компоненте в приложении, созданном Blazor из шаблона проекта веб-приложения. Task.Delay Вызов имитации данных погоды асинхронно. Компонент изначально отрисовывает содержимое заполнителя (» Loading. «), не ожидая завершения асинхронной задержки. После завершения асинхронной задержки и создания содержимого данных о погоде содержимое передается в ответ и исправлено в таблицу прогноза погоды.

@page "/weather" @attribute [StreamRendering(true)] . @if (forecasts == null) < 

Loading.

> else < @foreach (var forecast in forecasts) < >
@forecast.Date.ToShortDateString() @forecast.TemperatureC @forecast.TemperatureF @forecast.Summary
> @code < . private WeatherForecast[]? forecasts; protected override async Task OnInitializedAsync() < await Task.Delay(500); . forecasts = . >>

Подавление обновления пользовательского интерфейса ( ShouldRender )

ShouldRender вызывается каждый раз при отрисовке компонента. Переопределите ShouldRender, чтобы иметь возможность управлять обновлением пользовательского интерфейса. Пользовательский интерфейс обновляется, если реализация возвращает true .

Даже при переопределении ShouldRender компонент всегда проходит первоначальную отрисовку.

@page "/control-render" Control Render 

Control Render Example

Current count: @currentCount

@code < private int currentCount = 0; private bool shouldRender = true; protected override bool ShouldRender() < return shouldRender; >private void IncrementCount() < currentCount++; >>
@page "/control-render"  

Current count: @currentCount

@code < private int currentCount = 0; private bool shouldRender = true; protected override bool ShouldRender() < return shouldRender; >private void IncrementCount() < currentCount++; >>
@page "/control-render"  

Current count: @currentCount

@code < private int currentCount = 0; private bool shouldRender = true; protected override bool ShouldRender() < return shouldRender; >private void IncrementCount() < currentCount++; >>
@page "/control-render"  

Current count: @currentCount

@code < private int currentCount = 0; private bool shouldRender = true; protected override bool ShouldRender() < return shouldRender; >private void IncrementCount() < currentCount++; >>
@page "/control-render"  

Current count: @currentCount

@code < private int currentCount = 0; private bool shouldRender = true; protected override bool ShouldRender() < return shouldRender; >private void IncrementCount() < currentCount++; >>

Когда следует вызывать метод StateHasChanged

Вызов метода StateHasChanged позволяет запускать отрисовку в любое время. Тем не менее, метод StateHasChanged не следует вызывать без необходимости. Это распространенная ошибка, которая влечет за собой ненужные затраты ресурсов на отрисовку.

Код не должен вызывать метод StateHasChanged в следующих случаях:

  • Стандартная синхронная или асинхронная обработка событий, поскольку ComponentBase запускает отрисовку для большинства стандартных обработчиков событий.
  • Реализация типовой синхронной или асинхронной логики жизненного цикла, например OnInitialized или OnParametersSetAsync , поскольку ComponentBase запускает отрисовку для типовых событий жизненного цикла.

Тем не менее, вызов метода StateHasChanged может требоваться в случаях, которые описываются в следующих разделах этой статьи:

  • Использование нескольких асинхронных стадий в асинхронном обработчике
  • Получение вызова извне к системе обработки событий Blazor
  • Отрисовка компонента за пределами поддерева, которое повторно отрисовывается в связи с определенным событием

Использование нескольких асинхронных стадий в асинхронном обработчике

Из-за особенностей определения задач в .NET получатель Task может наблюдать только за его окончательным завершением, а не за промежуточными асинхронными состояниями. Таким образом, ComponentBase может активировать повторную отрисовку только при первом возвращении Task и при завершении Task. Платформа не может знать, когда необходимо выполнить повторную отрисовку компонента в других промежуточных точках, например, когда IAsyncEnumerable возвращает данные в виде последовательности промежуточных Task . Если требуется повторная отрисовка в промежуточных точках, вызовите в них метод StateHasChanged.

Рассмотрим следующий CounterState1 компонент, который обновляет число четыре раза каждый раз при выполнении IncrementCount метода:

  • Автоматическая отрисовка выполняется после первого и последнего приращений currentCount .
  • Отрисовка вручную активируется вызовами метода StateHasChanged, когда платформа не запускает повторные отрисовки автоматически в промежуточных точках обработки, где увеличивается значение currentCount .
@page "/counter-state-1" Counter State 1 

Counter State Example 1

Current count: @currentCount

@code < private int currentCount = 0; private async Task IncrementCount() < currentCount++; // Renders here automatically await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; // Renders here automatically >>
@page "/counter-state-1" 

Current count: @currentCount

@code < private int currentCount = 0; private async Task IncrementCount() < currentCount++; // Renders here automatically await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; // Renders here automatically >>
@page "/counter-state-1" 

Current count: @currentCount

@code < private int currentCount = 0; private async Task IncrementCount() < currentCount++; // Renders here automatically await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; // Renders here automatically >>
@page "/counter-state-1" 

Current count: @currentCount

@code < private int currentCount = 0; private async Task IncrementCount() < currentCount++; // Renders here automatically await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; // Renders here automatically >>
@page "/counter-state-1" 

Current count: @currentCount

@code < private int currentCount = 0; private async Task IncrementCount() < currentCount++; // Renders here automatically await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; StateHasChanged(); await Task.Delay(1000); currentCount++; // Renders here automatically >>

Получение вызова извне к системе обработки событий Blazor

ComponentBase имеет сведения только о собственных методах жизненного цикла и событиях, вызываемых Blazor. ComponentBase не располагает информацией о других событиях, которые могут возникать в коде. Например, Blazor не имеет сведений о любых событиях C#, вызываемых пользовательским хранилищем данных. Чтобы такие события вызывали повторную отрисовку для отображения обновленных значений в пользовательском интерфейсе, вызовите метод StateHasChanged.

Рассмотрим следующий компонент CounterState2 , который использует System.Timers.Timer для обновления счетчика с установленным интервалом и вызывает метод StateHasChanged для обновления пользовательского интерфейса:

  • OnTimerCallback выполняется за пределами управляемого потока отрисовки или уведомления о событии Blazor. Следовательно, OnTimerCallback должен вызвать метод StateHasChanged, поскольку Blazor не знает об изменениях currentCount в обратном вызове.
  • Компонент реализует IDisposable, где Timer удаляется, когда платформа вызывает метод Dispose . Дополнительные сведения см. в статье Жизненный цикл компонентов Razor ASP.NET Core.

Поскольку обратный вызов выполняется вне контекста синхронизации Blazor, компонент должен упаковать логику OnTimerCallback в ComponentBase.InvokeAsync, чтобы переместить ее в контекст синхронизации модуля отрисовки. Это поведение эквивалентно маршалингу потока пользовательского интерфейса на других платформах пользовательского интерфейса. Метод StateHasChanged может вызываться только из контекста синхронизации модуля отрисовки, иначе это приводит к возникновению исключения:

System.InvalidOperationException: ‘The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering or component state.’ (Текущий поток не связан с Dispatcher. Используйте InvokeAsync() для переключения выполнения на Dispatcher при активации отрисовки или состояния компонента).

@page "/counter-state-2" @using System.Timers @implements IDisposable Counter State 2 

Counter State Example 2

This counter demonstrates Timer disposal.

Current count: @currentCount

@code < private int currentCount = 0; private Timer timer = new(1000); protected override void OnInitialized() < timer.Elapsed += (sender, eventArgs) =>OnTimerCallback(); timer.Start(); > private void OnTimerCallback() < _ = InvokeAsync(() =>< currentCount++; StateHasChanged(); >); > public void Dispose() => timer.Dispose(); >
@page "/counter-state-2" @using System.Timers @implements IDisposable 

Counter with Timer disposal

Current count: @currentCount

@code < private int currentCount = 0; private Timer timer = new(1000); protected override void OnInitialized() < timer.Elapsed += (sender, eventArgs) =>OnTimerCallback(); timer.Start(); > private void OnTimerCallback() < _ = InvokeAsync(() =>< currentCount++; StateHasChanged(); >); > public void Dispose() => timer.Dispose(); >
@page "/counter-state-2" @using System.Timers @implements IDisposable 

Counter with Timer disposal

Current count: @currentCount

@code < private int currentCount = 0; private Timer timer = new(1000); protected override void OnInitialized() < timer.Elapsed += (sender, eventArgs) =>OnTimerCallback(); timer.Start(); > private void OnTimerCallback() < _ = InvokeAsync(() =>< currentCount++; StateHasChanged(); >); > public void Dispose() => timer.Dispose(); >
@page "/counter-state-2" @using System.Timers @implements IDisposable 

Counter with Timer disposal

Current count: @currentCount

@code < private int currentCount = 0; private Timer timer = new(1000); protected override void OnInitialized() < timer.Elapsed += (sender, eventArgs) =>OnTimerCallback(); timer.Start(); > private void OnTimerCallback() < _ = InvokeAsync(() =>< currentCount++; StateHasChanged(); >); > public void Dispose() => timer.Dispose(); >
@page "/counter-state-2" @using System.Timers @implements IDisposable 

Counter with Timer disposal

Current count: @currentCount

@code < private int currentCount = 0; private Timer timer = new Timer(1000); protected override void OnInitialized() < timer.Elapsed += (sender, eventArgs) =>OnTimerCallback(); timer.Start(); > private void OnTimerCallback() < _ = InvokeAsync(() =>< currentCount++; StateHasChanged(); >); > public void Dispose() => timer.Dispose(); >

Отрисовка компонента за пределами поддерева, которое повторно отрисовывается в связи с определенным событием

Пользовательский интерфейс может использоваться для выполнения следующих задач:

  1. Отправка события в один компонент.
  2. Изменение состояния.
  3. Повторная отрисовка совершенно другого компонента, который не является потомком компонента, получающего событие.

Одним из способов работы в таких сценариях является предоставление класса управления состоянием, часто в виде службы внедрения зависимостей, внедренной в несколько компонентов. Когда один компонент вызывает метод в диспетчере состояний, диспетчер состояний вызывает событие C#, которое затем получается независимым компонентом.

Сведения о подходах к управлению состоянием см. в следующих ресурсах:

  • Привязка между более чем двумя компонентами с помощью привязок данных.
  • Передайте данные по иерархии компонентов с помощью каскадных значений и параметров.
  • Серверная служба контейнеров состояния памяти (эквивалентная на стороне клиента) статьи управления состоянием .

Для подхода диспетчера состояний события C# находятся вне конвейера Blazor отрисовки. Вызовите StateHasChanged другие компоненты, которые вы хотите перенаправить в ответ на события диспетчера состояний.

Подход диспетчера состояний аналогичен предыдущему варианту с System.Timers.Timer предыдущим разделом . Поскольку стек вызовов выполнения, как правило, остается в контексте синхронизации модуля отрисовки, вызывать InvokeAsync обычно не требуется. Вызывать InvokeAsync требуется только в том случае, если логика выходит из контекста синхронизации, например в результате вызова ContinueWith для Task или ожидания Task с ConfigureAwait(false) . Дополнительные сведения см. в разделе Получение вызова извне к системе обработки событий Blazor.

Индикатор выполнения загрузки WebAssembly для Blazor веб-приложения

Индикатор хода загрузки отсутствует в приложении, созданном Blazor из шаблона проекта веб-приложения. Для будущего выпуска .NET планируется новая функция индикатора хода загрузки. В то же время приложение может внедрить пользовательский код для создания индикатора хода загрузки. Дополнительные сведения см. в статье Запуск ASP.NET Core Blazor.

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Что такое отрисовщик в диспетчере задач

Сообщения: 8215
Благодарности: 2838

Конфигурация компьютера
Процессор: Intel Pentium Dual-Core Mobile T2390 1866 МГц
Материнская плата: Quanta 30CC
Память: 2 × 512МБ DDR2-666 SDRAM (ProMos/Mosel Vitelic) (1 гиг)
HDD: TOSHIBA MK1646GSX 160 гиг sata
Видеокарта: Mobile GM965/GL960 Express Integrated Graphics Controller
Звук: 82801H (ICH8 Family) HD Audio Controller , Realtek ALC268
Блок питания: 65 w 2008 г
CD/DVD: TSSTcorp CDDVDW TS-L632N
Монитор: LG Philips LP154WX4-TLC8 (LPL 0120) 15.4″
ОС: Windows XP pro x32
Индекс производительности Windows: None
Прочее: Hewlett-Packard HP Pavilion dv6700 Notebook PC

Цитата brd:

Подскажите, куда копать. »

Цитата brd:

памяти (Mb): 256 »

Это сообщение посчитали полезным следующие участники:

Сообщения: 16
Благодарности: 0

Изображения

Добрый вечер, Petya V4sechkin,

Спасибо, что не оставили без внимания вопрос.

Цитата Petya V4sechkin:

Например, недостаток памяти.
Включите в Process Explorer -> меню View -> Select Columns -> вкладка Process Memory -> флажки «Private Bytes», «Virtual Size» и «Working Set Size» и посмотрите значения в соответствующих столбцах. »

см. прикрепленный файл

Цитата Petya V4sechkin:

Может быть проблема с жестким диском. »

Прогонял стандартной процедурой проверки HDD chkdsk /f/r, а также викторией (режим баттерфляй, remap) — не помогло.

Цитата Petya V4sechkin:

При наличии ошибок в журнале событий приведите их в соответствии с этими инструкциями. »

Никаких событий в журнале нет

Amigos,
очень смешно.

Сообщения: 53187
Благодарности: 15435

Конфигурация компьютера
Процессор: AMD Ryzen 7 7800X3D
Материнская плата: Gigabyte B650E Aorus Master
Память: Kingston Fury Renegade DDR5-6000 32GB (2×16)
HDD: Samsung SSD 850 PRO 256GB, 980 PRO 1TB
Видеокарта: Gainward GeForce RTX 3080 追风
Блок питания: be quiet! Straight Power 11 650W
Монитор: ASUS VG248QE 24″
ОС: Windows 10 Pro x64
Прочее: корпус Fractal Design Define R4

Цитата brd:

очень смешно

Не смешно, потому что Amigos прав. По своему опыту помню, как настраивал компьютеры с разным объемом памяти и сравнивал их отзывчивость. После установки чистой системы ситуация была примерно одинаковой. Но уже после установки антивируса экземпляры с 256 МБ начинали тормозить, часто обращаться к диску. Использовать их можно было только в качестве печатающей машинки.

Еще учтите, что у вас интегрированная графика, поэтому часть памяти расходуется на нее.
Малый объем доступной памяти также уменьшает размер кэша (что в конечном счете увеличивает количество операций чтения с диска). Запуск одних ресурсоемких приложений приводит к сбросу в файл подкачки других. HDD наверняка старый и медленный, поэтому вынужденные обращения к нему (и файлу подкачки в том числе) ввергают систему в глубокую задумчивость.

Конечно, можно вырезать, отключать, твикать (пытаясь сэкономить пару лишних мегабайт), но неизвестно, когда это «вырезанное» и «отключенное» понадобится в будущем (и вспомните ли вы, что именно включить обратно).

Последний раз редактировалось Petya V4sechkin, 01-01-2012 в 08:55 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *