什么相当于 WPF 应用程序中的 Application.DoEvents()
Posted
技术标签:
【中文标题】什么相当于 WPF 应用程序中的 Application.DoEvents()【英文标题】:What is equivalent to Application.DoEvents() in WPF applications 【发布时间】:2011-10-10 03:34:07 【问题描述】:从 MSDN 看来,Application.DoEvents() 在 Windows.Forms 中可用。 WPF 中的等价物是什么。
【问题讨论】:
您是否正在移植使用DoEvents
的旧版VB 6 应用程序?为什么你认为你需要一个等价物?
没有等价物。别那样做。没有。
@Cody:不,我实际上并没有移植任何东西。我只需要描述的功能。
仅供参考。调用 System.Windows.Forms.Application.DoEvents() 在 WPF 中可以正常工作,并且会运行您的调度程序事件等。您只需添加对它的引用。
@BrainSlugs83,WinForms 的 DoEvents
不会抽出 Dispatcher 操作(与 Dispatcher.BeginInvoke
一起排队)。 More details.
【参考方案1】:
即使在 Windows 窗体中也不应该使用它。不要在 UI 线程上执行长时间运行的任务 - 使用后台线程并使用 Dispatcher
根据需要更新 UI。对Application.DoEvents
的任何使用基本上都是代码异味。我不知道WPF中是否有等价物,但即使有,你也应该尽量避免。
【讨论】:
我不会称其为代码异味,因为有时您需要在计算中操作 UI 对象(除此之外不要做任何事情),在这种情况下,调用等效的DoEvents(). @TomasGrosup:我想说在很少的情况下使用Application.DoEvents
是有意义的。长时间运行的工作是纯粹创建 UI 是很不寻常的……而且通常先执行所有其他计算会更干净,然后再编组到 UI 线程以用于纯粹的 UI 部分。
好吧,假设您更新了数据绑定的对象,并且您的所有 OnPropertyChanged 都已触发。然后,您想打印视觉效果,在打印 WPF 视觉效果之前调用 DoEvents() 以确保在打印之前所有视觉效果都已更新,这肯定不是代码异味。
@BrainSlugs83:在后台工作线程中完成所有工作真的不应该让 UI 停止。听起来还有其他问题,应该在单独的问题中询问。 Application.DoEvents
可以解决直接症状,但它不是正确答案。
我同意这不是正确的答案——但除非我们都犯同样的错误(因为这个问题似乎很常见),否则两者都不是您在后台工作线程中的所有工作。 :-/ -- 谢谢@JonSkeet,我会考虑提出一个新问题。【参考方案2】:
虽然我同意 Skeet,但您可以在 documentation page of the DispatcherFrame
上找到类似的 WPF 方法
【讨论】:
实际上在某些情况下需要,即使您没有在 UI 线程上执行长时间运行的操作。我有一个用户控件,其中有一个作为 BackGroundWorker 的长时间运行的操作,它还使用调度程序更新 UI。但是,当后台工作程序运行时,控件会停止响应 Canvas.SetTop/Canvas.SetLeft,只有使用 MSDN 中的此代码才能绕过它。 @MalcolmMcCaffery:这听起来很奇怪,我从来没有遇到过这样的事情,毕竟BackgroundWorker
的全部意义在于保持 UI 响应。也许你在很短的时间内发布了太多更新,所以它会窒息......
感谢 DispatcherFrame 的链接。以上是关于什么相当于 WPF 应用程序中的 Application.DoEvents()的主要内容,如果未能解决你的问题,请参考以下文章