WPF Threading Practices - PullRequest
       2

WPF Threading Practices

1 голос
/ 31 марта 2012

Я немного новичок в WPF, но я понимаю, что по умолчанию приложение WPF имеет 2 потока; один для пользовательского интерфейса и один для управления. Правильно?

Скажем, в моем MainWindow появляются другие окна в собственной ветке. Поэтому я создаю новый поток, и в этом потоке я создаю экземпляр Foo1 (определенный как class Foo1 : Window). Затем создайте другой поток и создайте экземпляр Foo2 и т. Д. (Я делаю это с мыслью, что, поскольку каждое из этих окон выполняет некоторые интенсивные действия, возможно, они должны быть в своем собственном потоке).

Полагаю, мой вопрос в два раза:

a) это избыточное убийство или я должен просто создать экземпляр Foo1, Foo2, Foo3 из MainWindow все в одном потоке.

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

1 Ответ

1 голос
/ 31 марта 2012

а) Обычно это излишне. Все очень большие WPF-приложения, которые я видел, были построены только с одним потоком пользовательского интерфейса, поэтому в общем случае я бы сказал, что в этом нет необходимости. Возможно, вы найдете специальный случай, чтобы использовать его, но если бы вы постоянно использовали новые темы, я бы предположил, что может быть проблема с дизайном.

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

б) Это верно. Каждое окно (фактически каждый объект, производный от DispatcherObject) имеет свойство Dispatcher, которое даст вам доступ к диспетчеру для текущего окна. Вы обнаружите, что при вызове кода для обновления другого окна вам нужно будет получить диспетчер для этого окна и вызвать его.

...