#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-потоке. } ); }
Комментариев нет:
Отправить комментарий