AVollane
@AVollane
Начинающий C# разработчик

Как обновить данные DataGrid без зависания и чрезмерной нагрузки?

Всем добрый вечер! Разрабатываю программу для просмотра полной информации о процессах на компьютере:
6056500ae65c6610304357.png

Автоматическое обновление DataGrid реализовано в отдельном потоке при помощи привязке к свойству Processes в модели представления (пытаюсь придерживаться MVVM), реализующей интерфейс INotifyPropertyChanged:
public class MainVM : INotifyPropertyChanged
    {
        public MainVM()
        {
            // We perform the update operation in a separate thread
            Task.Run(() =>
            {
                // Endless cycle
                while (true)
                {
                    Processes = Process.GetProcesses().ToList();
                    Thread.Sleep(4000); // Updating every 4 seconds
                }
            });
        }
        private List<Process> _processes;
        public List<Process> Processes
        {
            get { return _processes; }
            set
            {
                _processes = value;
                OnPropertyChanged("Processes");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }


Разметка XAML для DataGrid:
<DataGrid Name="processesDataGrid" Grid.Row="1" AutoGenerateColumns="False" 
                  ItemsSource="{Binding Processes, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding MainModule.FileVersionInfo.CompanyName}" Value="Microsoft Corporation">
                            <Setter Property="Background" Value="HotPink"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Name" Binding="{Binding ProcessName}"/>
                <DataGridTextColumn Header="Title" Binding="{Binding MainWindowTitle}"/>
                <DataGridTextColumn Header="Memory Size" Binding="{Binding PagedMemorySize64}"/>
                <DataGridTextColumn Header="Threads count" Binding="{Binding Threads.Count}"/>
                <DataGridTextColumn Header="Company" Binding="{Binding MainModule.FileVersionInfo.CompanyName}"/>
                <DataGridTextColumn Header="Description" Binding="{Binding MainModule.FileVersionInfo.FileDescription}"/>
                <DataGridTextColumn Header="Copyright" Binding="{Binding MainModule.FileVersionInfo.LegalCopyright}"/>
            </DataGrid.Columns>
        </DataGrid>


Список процессов обновляется каждые 4 секунды, это указано в модели представления:
while (true)
{
     Processes = Process.GetProcesses().ToList();
     Thread.Sleep(4000); // Updating every 4 seconds
}

Но, дело в том, что приложение очень сильно тормозит, а каждые 4 секунды подвисает. Пользоваться им становится сложно. Да, я понимаю, что это всё из-за нагрузки, но в стандартном диспетчере задач Windows всё же работает без подвисаний. По этому, я ищу способ, как сделать обновление DataGrid максимально гладким.
Заранее спасибо.
  • Вопрос задан
  • 377 просмотров
Решения вопроса 1
edward_freedom
@edward_freedom
Не думаю что в диспетчере обновляются все данные сразу, а не по событию. Сделай вместо List Observablecollection и изменяй состояние конкретного обьекта и тебе не надо будет через 4 секунды обновлять весь список
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Prorom-exe
.NET developer
Методом ToList() ты высасываешь все объекты, попробуй вручную через Select брать только те, что нужны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы