在UI线程上运行昂贵的操作时,保持UI可视化更新

时间:2011-09-05 12:40:59

标签: wpf user-interface asynchronous dispatcher begininvoke

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

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

现在,我对线程的理解已经足够了解,如果我只是在我的UI线程上运行ExpensiveUIOperation(),那么TextBlock将不会出现以保持最新状态,因为UI线程将被阻止,停止任何界面更新。

所以我认为我可以像这样异步地进行:

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

但这仍然无效。在操作完成之前,文本块不会直观更新。

有办法吗?

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

2 个答案:

答案 0 :(得分:2)

  

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

这不足以成为滥用这样的UI线程的理由。在访问这些元素时使用Dispatcher(请参阅treading model reference),或者将视图正确绑定到相关属性,您甚至不需要这样做,因为更新会在内部排队到UI。

答案 1 :(得分:0)

您遇到困难,UI操作必须在UI线程上发生,并且在发生这种情况时,不会发生UI更新。您可以通过创建新的调度程序框架(http://dedjo.blogspot.com/2007/08/how-to-doevents-in-wpf.html)在WPF中执行相当于Application.DoEvents但是它很危险,您将在更新过程中捕获UI而不是一件好事。

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