在我的WPF应用程序中,我需要在我的UI线程上运行一个昂贵的操作(我们称之为ExpensiveUIOperation()
),我想让UI保持最新状态以跟踪它的进度。
为了跟踪进度,我只有一个TextBlock
,其Text
属性绑定到整数依赖属性PercentageComplete
。在ExpensiveUIOperation()
期间,我只需根据需要设置PercentageComplete
的值。
现在,我对线程的理解已经足够了解,如果我只是在我的UI线程上运行ExpensiveUIOperation()
,那么TextBlock将不会出现以保持最新状态,因为UI线程将被阻止,停止任何界面更新。
所以我认为我可以像这样异步地进行:
Dispatcher.BeginInvoke(new Action(ExpensiveUIOperation), DispatcherPriority.Background);
但这仍然无效。在操作完成之前,文本块不会直观更新。
有办法吗?
不幸的是,在这种情况下,我不能使用后台线程,因为该操作大量使用UI线程拥有的对象。
答案 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,例如?