Обновление WPF GUI из DLL - PullRequest
1 голос
/ 23 июля 2010

Похоже, это было бы довольно распространенной задачей, но мне не повезло в поиске ответа.

У меня есть приложение WPF / C #, которое в значительной степени опирается на dll для процедур базы данных.Я хотел бы, чтобы dll обновляла некоторые элементы GUI, то есть индикатор выполнения.

Пока что кажется, что ответ лежит где-то в System.ComponentModel и создании фонового работника.Но это насколько я могу получить.

Может кто-нибудь, пожалуйста, предложить предложения о том, как выполнить эту задачу?Ссылки, пример кода, поощряющие слова приветствуются!

Большое спасибо,

Джерри

Ответы [ 3 ]

3 голосов
/ 23 июля 2010

Лучше всего настроить его так, чтобы пользовательский интерфейс передавал функцию обратного вызова при вызове библиотеки DLL базы данных. DLL базы данных вызывает этот обратный вызов «периодически», а обратный вызов, реализованный в пользовательском интерфейсе, затем обновляет элементы пользовательского интерфейса.

Было бы лучше не допускать, чтобы DLL вашей базы данных портилась с вашим пользовательским интерфейсом. Во-первых, это сделало бы библиотеку DLL очень зависимой от специфики вашего пользовательского интерфейса до такой степени, что DLL не будет реально использоваться любым другим exe-файлом.

1 голос
/ 23 июля 2010

Трудно сказать, как именно работает ваш код сейчас, и я думаю, что ответ зависит от того, блокирует ли ваша текущая реализация пользовательский интерфейс (т. Е. Делает синхронный вызов вашей DLL БД).

Теперь, если ваш вызов DLL является синхронным и он блокирует пользовательский интерфейс, тогда, да, вы можете рассмотреть возможность использования BackgroundWorker для этой работы и позволить вашему основному потоку пользовательского интерфейса избежать зависания.Вы можете обратиться к Как мне реализовать индикатор выполнения в C #? для некоторых ответов.

Но вам все еще нужен какой-то механизм, чтобы узнать ход вашего вызова в БД, и он неПохоже, DLL пока что-то раскрывает.

Просто читая между строк вашего вопроса, звучит так, как будто у вас есть возможность изменить DLL.Если это так, то вы должны попытаться использовать шаблон, который сохраняет разделение между DLL и вашим пользовательским интерфейсом при предоставлении информации о ходе выполнения.Ваш код пользовательского интерфейса должен действительно отвечать за обновление на основе некоторых данных, которые DLL может предоставить в слабосвязанной форме.Я бы предложил использовать:

  • Модель подписки, прослушивая событие, опубликованное некоторым классом в DLL;или
  • Модель опроса для активного мониторинга некоторого объекта данных, реализуемого в DLL на периодической основе (например, во время обработчика Timer Tick).

В любом случае, вы хотите избежатьтесно связывая два уровня вместе, кодируя DLL, чтобы иметь глубокие знания вашего уровня пользовательского интерфейса.Обе вышеупомянутые возможности должны позволять вам сохранять код обновления пользовательского интерфейса в основном потоке пользовательского интерфейса исполняемого файла приложения в большинстве случаев, что важно, если вы хотите избежать проблем с многопоточностью.

0 голосов
/ 23 июля 2010

A BackgroundWorker будет работать, как и Task объект (лично я предпочитаю Task). В моем блоге есть пример того, как они выполняют фоновую работу, с полной поддержкой отмены и постепенного прогресса. Вам может не понадобиться этот уровень сложности (например, отмена).

...