2015-06-14 8 views
4

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

WPF приложения запускаются с двумя потоками:

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

Это звучит хорошо, но нить UI беспокоит меня, UI Thread нет ничего, кроме резьбы Применения

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

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

1.Now, Мой вопрос UI Нить поток приложения, Button будут иметь свои собственные DispatcherObject и два текстовых поля будут иметь свои собственные DispatcherObject, как этот поток пользовательского интерфейса, который имеет свой собственный DispatcherObject и отличается от этих элементов управления пользовательского интерфейса DispatcherObject может обновлять текстовые поля?

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

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

+0

Это звучит очень запутанно. Создайте конкретный образец, который показывает случаи вашей проблемы. –

+0

@ DanielHilgarth, Не могли бы вы рассказать, какая часть сбивает с толку? – Selva

ответ

2

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

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

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

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

+0

Вы хотите сказать, что поток пользовательского интерфейса может обновлять весь его элемент пользовательского интерфейса, даже если элементы пользовательского интерфейса (текстовое поле, кнопка и т. Д.). Объект диспетчера отличается от потока пользовательского интерфейса. Диспетчерский объект? Если это так, скажем, для textbox1, я могу обновить textbox1 двумя способами: 1. По потоку объекта интерфейса пользователя Dispatcher и 2. По textbox1 Dispatcher object. пожалуйста, исправьте меня. – Selva

+0

Я не знаю о случае нескольких диспетчеров.Обычно в каждом потоке есть один диспетчер. Я не знаю, может ли это быть иначе. Даже если это может быть похоже на ненужное осложнение. Общее правило заключается в том, что вам нужно вызвать диспетчера, который владеет объектом, если вы сейчас не находитесь в этом потоке диспетчера. – usr