【发布时间】:2012-11-14 11:36:13
【问题描述】:
我编写了一个辅助类,可用于在我的 GUI 上运行长时间运行的任务。它所做的是使用样式来显示“工作”动画并淡出内容,以便在任务运行时,用户可以看到正在进行的事情。
我的问题是,当长时间运行的任务完成时,它会将内容淡入并隐藏工作动画 - 这是它应该做的,但因为我使用 MVVM 并且主要是数据绑定用于我的所有内容显示, GUI 组件的更新与长时间运行的任务分开进行。即数据绑定 OnPropertyChanged("") 事件触发,然后在长时间运行的任务完成后由 GUI 线程拾取。但问题是当长时间运行的任务完成时,Worker Animation 会关闭,但在数据绑定更新之前。
因此,最终结果是您在任务运行时按预期显示工作动画,但对于所有树数据的大型数据集,数据绑定更新需要 4-5 秒甚至更长的时间,在此期间,应用程序未处于“工作动画模式”,只是冻结。
有没有一种方法可以让我的工作动画继续运行,不仅适用于 Long running Method,而且适用于来自 OnPropertyChanged 的相关数据绑定更新?
【问题讨论】:
-
您是否尝试在长时间运行的方法完成工作时调用 NotifyPropertyChanged 方法?
-
长时间运行的方法会遍历并更新大量 ViewModel 对象、大量属性。在每个属性的 Setter 中,我调用 OnPropertyChanged(),因此这些都在长时间运行的方法完成之前被调用,因为它们是其中的一部分。是你说的方法吗?我不确定 INotifyPropertyChanged 的内部工作原理,但根据观察到的行为,我猜 INotifyPropertyChanged 将调用发送到 GUI 调度程序线程,然后与所有后续线程一起排队,直到长时间运行的工作完成并且 GUI线程释放了吗?
-
您是否正在执行您的长期任务?在单独的线程、后台工作人员等上?可以发一些代码吗?
标签: wpf data-binding progress