Многопоточный пользовательский интерфейс WPF - Usercontrols - PullRequest
1 голос
/ 26 января 2011

Я видел несколько примеров кода многопоточных интерфейсов в WPF с использованием нескольких окон, где каждое окно работает в своем собственном потоке интерфейса. Мне интересно, есть ли способ сделать это с помощью встроенных элементов управления?

Например, допустим, у меня есть usercontrol1 и usercontrol2, оба встроенные в Window1. Usercontrol1 начинает вращаться и блокирует основной поток пользовательского интерфейса. Окно и usercontrol2 осуществляются. Есть ли способ сделать это так, даже если блоки usercontrol1, Window1 + usercontrol2 по-прежнему реагируют?

Давайте предположим, что мы не контролируем разработчиков usercontrol1 - поэтому мы не можем сказать им, чтобы они управляли поведением.

Предположим также, что обмен данными между usercontrol1 + 2 является обязательным.

Должен ли я изучать что-то вроде AddIn?

Ответы [ 2 ]

1 голос
/ 26 января 2011

Вы не можете "запустить" элементы управления в другом потоке (как и в Winforms, сами элементы управления должны быть созданы и запущены в том же потоке, что и родительский элемент верхнего уровня), но ничто не мешает вам действия над другим потоком из пользовательского элемента управления. Вам просто нужно убедиться, что вы используете от Dispatcher до Invoke любых операций, которые будут иметь непосредственное влияние на сам элемент управления. Однако закулисная обработка может выполняться полностью в другом потоке; это просто физическое обновление пользовательского интерфейса, которое должно быть вызвано обратно через Dispatcher.

РЕДАКТИРОВАТЬ: После того, как вопрос был отредактирован, нет, невозможно переместить всю «работу», которую конкретный компонент выполняет, в другой поток. Если вы не можете контролировать разработку рассматриваемого компонента, тогда вы зависите от разработчика и от того, где он решит выполнить код.

0 голосов
/ 26 января 2011

Как и наверху, у вас есть визуал ( Окно ), который наследуется от DispatcherObject . Он спроектирован как модель потоков STA, в которой один поток обращается к методам и свойствам объекта.

Именно поэтому оба элемента управления должны быть созданы в том же потоке, что и Window.

Если вам нужно обмениваться данными между элементами управления, а вы не контролируете разработчиков этих элементов управления, я хотел бы рассмотреть возможность использования PRISM или другой инфраструктуры MVVM. В призме у вас есть EventAggregator , который в основном является шаблоном подписчика подписчика, ваш UserControl1 может опубликовать что-то, а другой, если он подписан, получит это.

...