Визуальное обновление пользовательского интерфейса при выполнении дорогостоящей операции в потоке пользовательского интерфейса. - PullRequest
0 голосов
/ 05 сентября 2011

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

Дляотслеживать прогресс, у меня просто есть TextBlock, чье свойство Text связано со свойством целочисленной зависимости PercentageComplete.Во время ExpensiveUIOperation() я просто устанавливаю значение PercentageComplete как требуется.

Теперь я достаточно разбираюсь в многопоточности, чтобы знать, что если бы я просто запустил ExpensiveUIOperation() в своем потоке пользовательского интерфейса, TextBlock не отображается , чтобы быть в курсе, поскольку поток пользовательского интерфейса будет блокирован, что приведет к остановке любых обновлений интерфейса.

И поэтому я подумал, что могу сделать это асинхронно, как это:

Но это все еще не работает.Текстовый блок не обновляется визуально до завершения операции.

Есть ли способ сделать это?

К сожалению, в этой ситуации я не могу использовать фоновый поток, так какоперация интенсивно использует объекты, принадлежащие потоку пользовательского интерфейса.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

К сожалению, в этой ситуации я не могу использовать фоновый поток, так как операция интенсивно использует объекты, принадлежащие потоку пользовательского интерфейса.

Это недостаточно веская причина для злоупотребленияUI-нить, как это.Используйте Диспетчер при доступе к этим элементам (см. справочник по модели протектора ) или правильно привяжите свое представление к соответствующим свойствам, и вам даже не нужно будет делать это, поскольку обновления ставятся в очередь внутри пользовательского интерфейса.

0 голосов
/ 05 сентября 2011

Вы застряли, операции пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса, и пока это происходит, никаких обновлений пользовательского интерфейса не произойдет.Вы можете сделать эквивалент Application.DoEvents в WPF, создав новый фрейм диспетчера (http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.html), но это опасно, вы будете ловить пользовательский интерфейс в середине обновлений, а это не очень хорошая вещь.

Является ли дорогостоящая операция пользовательского интерфейса действительно ресурсоемкой операцией только для пользовательского интерфейса? Ничего нельзя сделать с графом объектов View Model, а затем, наконец, связать с пользовательским интерфейсом, например?

...