2010-01-28 3 views
1

Скажем, у меня есть два пользовательских элемента управления, UC1 и UC2. Пользователь выбирает что-то в UC1, что занимает некоторое время, поэтому процесс отключается. UC2 должен обновить свой вид и выполнить некоторую работу в другом потоке, когда UC1 завершится. Но UC2 зависит от вывода фонового потока UC1, поэтому он должен дождаться завершения этого потока до его начала.WPF Threading question

UC1 необходимо обновить ObservableCollection, чтобы обновить его представление, когда его фоновый поток заканчивается, как и UC1, асинхронно.

Каков наилучший способ сделать это? Я попробовал просто их пронизывать и выпустить сообщение из потока UC1, но затем UC2 не может изменить его ObservableCollection, потому что он не находится в правильной нити, - он думает об этом в потоке UC1.

Нужно ли мне перенастраивать событие сообщения от UC1 до UC2, это безопасно?

Как люди обычно справляются с этим?

ответ

2

Оба UserControls должны жить в одном потоке. Вот как работает WPF.

С UC2 зависит от события, которое UC1 также зависит, я бы сферу uc1 время жизни события, и отправить сообщение UC2, когда работа сделана, или еще есть UC2 подписаться на ObservableCollection «s CollectionChanged мероприятие. Они оба живут в одной и той же ветке пользовательского интерфейса, поэтому сортировка между ними не нужна, вам просто нужно маршалировать фоновый поток соответствующим UserControl.

+0

Нет, хотя верно, что UC1 и UC2 находятся в одном и том же потоке пользовательского интерфейса, если в UC1 вы запускаете новый поток фонового процесса, чтобы выполнить работу, - это новый поток, в который не включены ни UC1, ни UC2. Если вы запускаете сообщение из этого потока, которое получает UC2, событие сообщения по-прежнему находится в этом фоновом потоке, поэтому вы не можете ничего сделать с вашими наблюдаемыми коллекциями. Именно здесь я и думал, что вам нужно будет собрать этот фоновый поток обратно в поток пользовательского интерфейса, а затем позволить UC2 выполнять свою работу. – Nicros

+0

К сожалению, пропустил последнее предложение - я думаю, вопрос будет состоять в том, как я должен обработать сообщение из потока BackgroundWorker на поток пользовательского интерфейса пользовательского элемента управления, который получил сообщение? – Nicros

+0

Миссия завершена! Использование BackgroundWorker - это ключ, так как любые обработчики событий RunWorkerCompleted автоматически возвращаются в поток пользовательского интерфейса (в моем случае). Круто. – Nicros