Всем добрый вечер! Разрабатываю программу для просмотра полной информации о процессах на компьютере:
Автоматическое обновление 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 максимально гладким.
Заранее спасибо.