【问题标题】:WPF Dispatcher not releasing object for GCWPF Dispatcher 不为 GC 释放对象
【发布时间】:2014-12-20 14:10:36
【问题描述】:

我正在尝试跟踪我的应用程序中的一些内存泄漏,并且根据 ANTS 分析器,我的许多对象都得到了 System.Windows.Threading.Dispatcher 的帮助。我的应用程序基本上是单线程的,我对 Dispatcher.Invoke 进行的唯一显式调用与被阻止的对象无关。这些对象似乎都是我的 FixedDocument 子类的 UserControl 子类,如果这对任何人都有意义的话。

是什么导致调度程序不释放我的对象?

【问题讨论】:

    标签: wpf memory-leaks dispatcher


    【解决方案1】:

    调度程序上安排了一项操作(例如,使用BeginInvoke),该操作的一个参数直接或间接引用了您的ReportVisualTable

    查看保留图中包含的类型,看起来DocumentViewer 试图将页面显示在视图中,但该页面尚未加载,因此调度程序延迟了该操作。该操作以优先级Inactive 排队,这意味着它将无限期地坐在队列中,因为该优先级永远不会被处理。当请求的页面被加载时,操作的优先级会提升到Background,但如果这种情况永远不会发生,那么操作似乎将保持非活动状态。

    【讨论】:

    • 有没有办法可以强制执行该操作以释放对象?现在它似乎无限期地存在。
    • 您是否在添加后几乎立即从可视化树中删除了一些文档?这可能是文档查看器中的设计缺陷。请求页面加载完成后,支持将操作的优先级更改为Background。如果这没有发生,它看起来会永远留在队列中。
    • 也许就是这样......没有内置功能(我可以找到)来删除页面,所以现在删除页面会导致重建整个文档。如果我一次删除 2 页以上的文档,则会快速连续更改文档。
    • 您可以尝试通过在调度程序上以Loaded 的优先级调度它来推迟删除;如果这没有帮助,请尝试Background。如果你走那条路,请小心造成类似的内存泄漏或数据竞争:)。
    • 谢谢!我有一些工作要解决这个问题,但至少现在我知道问题所在了。
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多