Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Изменяя значение DataGrid в другом потоке

#c_sharp #wpf #многопоточность #datagrid


Есть DataGrid, в него заношу новый объект. Если я в основном потоке получаю ссылку
на первый Item у DataGrid, привожу его к типу и изменяю свойства, то и значения в таблице
тоже меняются. Но если же я создаю новый поток и в нем проделываю тоже самое, ничего
не получается. Даже если я проделываю это через BeginInvoke

RobotsInfo ri = (RobotsInfo)dataGrid.Items[0];
ri.Name = "AAA";


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


Ответы

Ответ 1



Попросите Dispatcher выполнить эти действия в "правильном" потоке: dataGrid.Dispatcher.Invoke(() => { RobotsInfo ri = (RobotsInfo)dataGrid.Items[0]; ri.Name = "AAA"; });

Ответ 2



В .NET Доступ к UI потоку ограничен в целях безопасности. Поэтому нужно использовать диспетчер. Ниже приведён пример, как можно выполнить операции с UI в требуемом потоке. // Создаём и запускаем поток. private void Button_Click(object sender, RoutedEventArgs e) { Thread thread = new Thread(UpdateTextWrong); thread.Start(); } // Метод, который будет выполняться в потокею private void UpdateTextWrong() { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { // Делаем что-то в UI-потоке. } ); }

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

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