【问题标题】:How to increase the performance of WPF Application如何提高 WPF 应用程序的性能
【发布时间】:2009-05-21 11:50:23
【问题描述】:

我已经开发了 WPF 应用程序。在该应用程序中,我将 200mb 照片加载到列表框。之后,我将这些图像添加到画布。一段时间后(即添加 10mb 图像后)将照片添加到画布时,我遇到了一些错误,例如 ----

*****CLR 在 60 秒内无法从 COM 上下文 0x10b46f0 转换到 COM 上下文 0x10b4860。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。*****

有什么方法可以提高我的应用程序的性能。我需要解决这个问题。

对此有任何建议。

【问题讨论】:

    标签: wpf performance c#-3.0


    【解决方案1】:

    不要在您的 UI 线程上一次将所有 200 mb 的照片加载到列表框中。用户会同时查看 200 mb 吗?这需要您做一些工作,但您需要从后台线程延迟加载图像。

    【讨论】:

    • 是的,用户将查看列表框中的所有图像。将图像加载到列表框中不是问题。我为此使用后台线程。但问题在于将照片添加到画布时。为了添加,我还使用了后台工作人员。
    【解决方案2】:

    看看这个article(Advanced Techniques To Avoid and Detect Deadlocks In .NET Apps),它可能会有所帮助。

    【讨论】:

      【解决方案3】:

      这看起来像两个问题,第一个是您正在后台线程中加载图像,但没有正确执行;因此,COM错误。仔细检查您是否有一个 STAThread 应用程序,并且图像加载线程没有与 WPF 调度线程错误地交互。这是discussion MTA 与 STA;但是,WPF 需要 STA,而且是一场失败的战斗。

      第二个问题似乎是应该如何做到这一点;也就是说,加载一堆图像进行显示。我会考虑使用 ListView 的惰性数据绑定,并让内置的虚拟化演示者管理图像的加载/显示。

      这里有一些关于使用 view-model 的文档。 viewmodel 可以协调图像加载并为 ListView 提供绑定源,该绑定源将自动使应用程序正常工作。

      更简单的选择可能是启动后台线程并将图像加载到 ObservableCollection,将其绑定到 ListView 并让框架处理显示。

      我同意 Greg D 的说法,加载 200mb 的图像听起来像是解决问题的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多