Задать вопрос

Как получать данные из БД каждые 10 секунд (Entity Framework)?

Здравствуйте!
Разрабатываю на данный момент приложение по обмену сообщениями.
Суть его такова есть база данных FireBird, есть приложение которое подключается к БД через Entity Framework, в приложение есть DataGrid в который выводятся данные из базы примерно вот так
Model1 db = new Model1();
db.USER.Load();
usersGrid.ItemsSource = db.USER.Local.ToBindingList();

Есть добавление и удаление данных.
Так как само приложение можно запустить много раз и разные пользователи могут вносить изменения возникает потребность в постоянном обновление данных в DataGrid.
Я решил вынести получение данных в отдельный поток (поправьте меня если я двигаюсь в не правильном направление) в котором раз 10 секунд будет происходить
db.USER.Load();
Но это не дало результатов. Поток выполняется обращение к базе происходить(в логе приложения это видно), но данные в DataGrid не обновляются. Скажите есть ли принудительное обновление данных в WPF? А так же буду очень благодарен за дельные статьи по многопоточному программированию в С# с WPF и Entity Framework. (потому как те что я нахожу ограничиваются простейшими вещами типа подсчёта факториала в отдельном потоке)

p.s. Я понимаю что работать с базой из 100 одновременно включенных приложений которые будут обращаться к неё каждые 10 секунд не лучшая идея и следовало бы делать клиент серверное приложение. Но это не представляется возможным по той причине что доступа к самому серверу нет, есть лишь доступ к базе Firebird.
  • Вопрос задан
  • 1133 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Sumor
Строчка usersGrid.ItemsSource = db.USER.Local.ToBindingList(); говорит о том, что конкретно этот текущий список записей из таблицы опубликовать в DataGrid. При повторном выполнении Load() у вас создаются новые списки, никак не связанные с тем, что находится сейчас в DataGrid. Поэтому обновления не происходит.
Чтобы понять что изменилось в БД с момента прошлого считывания можно использовать, например, время изменения записи. И каждые 10 (или сколько вы захотите) секунд считывать только изменённые записи.
Просто так изменённые записи в уже считанный и добавленный в грид список не обновить. Нужно найти среди существующих строчек те, что обновились в соответствии с запросом и изменить их реквизиты. Так как вы используете BindingList, то по идее после изменения записи в списке DataGrid должен обновить запись на экране.
Схема может быть примерно такая:
DataGrid на форме привязан (Binding) к один раз созданному списку сообщений типа BindingList<> или ObservableCollection<>. Сообщения, которые хранятся в этом списке должны реализовывать шаблон PropertyChanged. Список первоначально начитывается при старте формы. После создания, заполнения и привязки к DataGrid нельзя удалять/пересоздавать список. Если вам нужно его перечитать целиком - выполняете Clear() и добавляете записи заново. Далее по таймеру считываете изменённые или добавленные записи и пробегаете по вашему списку и их находите и изменяете. Отрабатывает PropertyChanged на сообщениях, отрабатывает изменение списка, отрабатывает обновление DataGrid. Если у вас считывание из базы происходит недолго, то вам достаточно использовать DispatcherTimer. Он выполняется в том же потоке где живёт DataGrid и список сообщений. Если же вас это не устраивает и вы хотите поиграть в потоки, то вам нужно использовать потокобезопасные коллекции и/или устраивать синхронизацию действий. Но это тема другого вопроса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Smilleey
Надо бы использовать MVVM, тогда можно будет принудительно использовать PropertyChanged. В данном случае всё будет нормально обновляться.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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