Как работает многопоточность WPF?

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

Приложения WPF начинаются с двух потоков:

один для обработки рендеринга, а другой для управления пользовательским интерфейсом.

Звучит неплохо, но поток пользовательского интерфейса меня беспокоит, поток пользовательского интерфейса - это не что иное, как поток приложения

Поток, который создает элемент пользовательского интерфейса WPF, владеет элементами, а другие потоки не могут напрямую взаимодействовать с элементами пользовательского интерфейса, это известно как сходство потоков.

Скажем, у меня есть два текстовых поля и одна кнопка в Myapplication, и каждое текстовое поле имеет свой собственный DispatcherObject, при нажатии кнопки я обновляю текстовое поле со значениями, надеюсь, это будет сделано с помощью Тема пользовательского интерфейса.

1. Теперь у меня вопрос: UI Thread - это поток приложения, Button будет иметь собственный DispatcherObject, а Два текстовых поля будут иметь свои собственные DispatcherObject. Как этот поток пользовательского интерфейса, который имеет свой собственный DispatcherObject и отличается от этих элементов управления пользовательским интерфейсом, DispatcherObject может обновлять текстовые поля?

  1. Другой вопрос: если создать новое текстовое поле в фоновом потоке, могу ли я обновить это текстовое поле из потока пользовательского интерфейса?

пожалуйста, поправьте мое понимание, я не мог продолжить.


person Selva    schedule 14.06.2015    source источник
comment
Это действительно сбивает с толку. Создайте конкретный образец, демонстрирующий вашу проблему.   -  person Daniel Hilgarth    schedule 14.06.2015
comment
@DanielHilgarth, подскажите, пожалуйста, какая часть сбивает с толку?   -  person Selva    schedule 18.06.2015


Ответы (1)


Каждый DispatcherObject связан с потоком пользовательского интерфейса. Только этот поток может получить доступ к этому конкретному DispatcherObject. В приложении WPF с разумной архитектурой есть только один поток пользовательского интерфейса. Все элементы создаются и доступны там.

У вас может быть несколько потоков пользовательского интерфейса с различными наборами элементов, но это будет эзотерический сценарий, который принесет много проблем.

Если создать новое текстовое поле в фоновом потоке

Это текстовое поле будет привязано к фоновому потоку и может использоваться только там. Следовательно, вы не можете подключить его к основному дереву элементов. Это было бы бесполезно.

person usr    schedule 14.06.2015
comment
Вы хотите сказать, что поток пользовательского интерфейса может обновлять все свои элементы пользовательского интерфейса, даже если элементы пользовательского интерфейса (текстовое поле, кнопка и т. Д.) Объект Dispatcher отличается от объекта Dispatcher потока пользовательского интерфейса? Если это так, скажем, для textbox1, я могу обновить textbox1 двумя способами: 1. С помощью объекта Dispatcher потока пользовательского интерфейса и 2. С помощью объекта Dispatcher textbox1. поправьте меня пожалуйста. - person Selva; 18.06.2015
comment
Я не знаю, как обстоят дела с несколькими диспетчерами. Обычно на каждый поток приходится один диспетчер. Не знаю, может ли это когда-нибудь быть по-другому. Даже если это возможно, это кажется ненужным осложнением. Общее правило заключается в том, что вам необходимо вызвать диспетчера, которому принадлежит объект, если вы не находитесь в потоке диспетчера прямо сейчас. - person usr; 18.06.2015