我在我们的 WPF 应用程序中看到内存泄漏。在使用 .NET Memory Profiler 时,我可以看到,即使在关闭窗口之后,DataContext 和 UI 元素都仍然存在,因为 Dispatcher 队列中的 DispatcherOperations 中的 Action 委托......但具有 ContextIdle 优先级并且似乎从来没有得到处理。
当我的窗口关闭时,我可以强制调度程序队列刷新吗?
我在我们的 WPF 应用程序中看到内存泄漏。在使用 .NET Memory Profiler 时,我可以看到,即使在关闭窗口之后,DataContext 和 UI 元素都仍然存在,因为 Dispatcher 队列中的 DispatcherOperations 中的 Action 委托......但具有 ContextIdle 优先级并且似乎从来没有得到处理。
当我的窗口关闭时,我可以强制调度程序队列刷新吗?
您可以尝试在 Window.Closing 事件中使用具有优先级 ContextIdle 的 dispatcher.Invoke 对虚拟方法进行同步调用。这应该会阻止 UI 线程生成更多调度程序项目,并且应该仅在处理完最后一个 ContextIdle 项目后返回。但是,我无法验证,因为没有 Telerik 组件 ContextIdle 项目在窗口关闭之前得到处理,无论如何。
我还可以想象这些项目在循环中运行,即在执行过程中重新创建自己。在这种情况下,在关闭窗口之前将 DataContext 显式设置为 null 可能会有所帮助。这可能会向组件发出信号,表明它们可以停止循环,至少您不会以这种方式泄漏数据上下文对象的实例。