Несколько потоков для загрузки разных сеток, прикрепленных к разным наборам коллекций, извлеченных из базы данных.

У меня есть приложение wpf, созданное с использованием шаблона проектирования MVVM. В данном представлении есть 5 сеток, привязанных к разным наборам коллекций, то есть 5 коллекций для 5 сеток. Теперь я не хочу вешать пользовательский интерфейс, пока 5 наборов данных извлекаются из базы данных.

Пожалуйста, дайте мне знать, если следующее решение является хорошей идеей, еще, пожалуйста, предложите его:

  1. 5 наблюдаемых коллекций для привязки к сеткам
  2. 5 делегатов, вызывающих BeginInvoke для операции db, и у каждого будет IEnumerable Collection<Type> на EndInvoke.
  3. Обратный вызов делегата oncomplete заполнит ObservableCollection<Type> из IEnumerable collection<Type>, чтобы позволить диспетчеру обновить пользовательский интерфейс из потока пользовательского интерфейса, поскольку begininvoke будет работать в потоке пула потоков.

person Samujjal    schedule 28.11.2011    source источник
comment
Будьте готовы разделить эти обновления. Не имеет значения, если вы используете многопоточность, если вы забиваете пользовательский интерфейс множеством обновлений.   -  person    schedule 29.11.2011
comment
@Will: правильно, потому что только один поток пользовательского интерфейса, который удаляет конвейер сообщений из очереди :)   -  person sll    schedule 29.11.2011
comment
@sll: Возможно, после пары итераций обновлений WinRT мы получим более одного потока пользовательского интерфейса friggen. Будь ты проклят, Ком!   -  person    schedule 29.11.2011
comment
Интересно, как в данном случае задействован COM? На самом деле нет таких глубоких знаний   -  person sll    schedule 29.11.2011


Ответы (1)


Следует использовать компонент BackgroundWorker, чтобы упростить перемещение работы в фоновый поток, а затем синхронизация обратно в пользовательский интерфейс. В противном случае ваш общий подход звучит просто находкой.

person Kent Boogaart    schedule 28.11.2011
comment
Имеет ли смысл (обновление пользовательского интерфейса несколькими потоками) вообще, поскольку вообще существует один поток пользовательского интерфейса? - person sll; 29.11.2011
comment
Будет ли Dispatcher.BeginInvoke работать для выполнения длительных вызовов базы данных, чтобы поток пользовательского интерфейса не зависал? - person Samujjal; 29.11.2011
comment
Чтобы быть более точным, вызовет ли 5 ​​вызовов Dispatcher.BeginInvoke 5 потоков из пула потоков?? - person Samujjal; 29.11.2011