【问题标题】:WPF Dispatcher Operations LeakWPF 调度程序操作泄漏
【发布时间】:2013-02-08 23:10:09
【问题描述】:

我发现我们的 WPF 应用程序存在内存泄漏。在使用 .NET Memory Profiler 时,我可以看到,即使在关闭窗口之后,DataContext 和 UI 元素都仍然存在,因为 Dispatcher 队列中的 DispatcherOperations 中的 Action 委托......但具有 ContextIdle 优先级并且似乎从来没有得到处理。

当我的 Window 关闭时,我可以强制 Dispatcher 队列刷新吗?

【问题讨论】:

  • 谁在以ContextIdle 优先级排队操作?为什么?修复那个不是更好吗?
  • 第三方组件——即 Telerik
  • 你就这个问题联系过他们?
  • 是的,除了“这不应该发生,我们无法重现”之外,没有任何有用的回复。我无法使用非常简单的虚拟应用程序进行复制,他们希望在进一步考虑问题之前进行独立复制。

标签: c# .net wpf dispatcher


【解决方案1】:

您可以尝试在 Window.Closing 事件中使用具有优先级 ContextIdle 的 dispatcher.Invoke 对虚拟方法进行同步调用。这应该会阻止 UI 线程生成更多调度程序项目,并且应该仅在处理完最后一个 ContextIdle 项目后返回。但是,我无法验证,因为没有 Telerik 组件 ContextIdle 项目在窗口关闭之前得到处理,无论如何。

我还可以想象这些项目在循环中运行,即在执行过程中重新创建自己。在这种情况下,在关闭窗口之前将 DataContext 显式设置为 null 可能会有所帮助。这可能会向组件发出信号,表明它们可以停止循环,并且至少您不会以这种方式泄漏数据上下文对象的实例。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 2011-05-20
    • 1970-01-01
    • 2014-08-23
    • 2010-11-27
    • 2012-05-07
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多