0

在我的 WPF 应用程序中,我需要在我的 UI 线程上运行一个昂贵的操作(我们称之为它ExpensiveUIOperation()),并且我想保持 UI 是最新的以跟踪它的进度。

为了跟踪进度,我只需要一个TextBlock,它的Text属性绑定到一个整数依赖属性PercentageComplete。在 期间ExpensiveUIOperation(),我只是根据需要设置 的值PercentageComplete

现在,我对线程有足够的了解,知道如果我只是ExpensiveUIOperation()在我的 UI 线程上运行,TextBlock 似乎不会保持最新,因为 UI 线程将被阻止,停止任何界面更新。

所以我想我可以像这样异步地做到这一点:

Dispatcher.BeginInvoke(new Action(ExpensiveUIOperation), DispatcherPriority.Background);

但这仍然行不通。在操作完成之前,文本块不会在视觉上更新。

有没有办法做到这一点?

不幸的是,在这种情况下,我不能使用后台线程,因为该操作大量使用了 UI 线程拥有的对象。

4

2 回答 2

2

不幸的是,在这种情况下,我不能使用后台线程,因为该操作大量使用了 UI 线程拥有的对象。

这不是像这样滥用 UI 线程的充分理由。在访问这些元素时使用 Dispatcher(请参阅踩踏模型参考),或者将您的视图正确绑定到相关属性,您甚至不需要这样做,因为更新在内部排队到 UI。

于 2011-09-05T19:51:06.887 回答
0

你被卡住了,UI 操作必须在 UI 线程上发生,而当发生这种情况时,不会发生 UI 更新。Application.DoEvents您可以通过创建一个新的调度程序框架(http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.html)来做相当于 WPF 中的UI 在更新过程中并不是一件好事。

昂贵的 UI 操作真的是 CPU 密集型、仅 UI 的操作吗?例如,没有什么可以用 View Model 对象图完成,然后最终绑定到 UI?

于 2011-09-05T12:43:10.037 回答