Как получать данные из БД каждые 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.
  • Вопрос задан
  • 1124 просмотра
Решения вопроса 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. В данном случае всё будет нормально обновляться.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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