.net - 使用附加行为防止内存泄漏

标签 .net wpf memory

我在我的 WPF 应用程序中创建了一个“附加行为”,它允许我处理 Enter 按键并移动到下一个控件。我叫它EnterKeyTraversal.IsEnabled,代码可以看我的博客here .

我现在主要担心的是我可能有内存泄漏,因为我正在处理 UIElements 上的 PreviewKeyDown 事件并且从未明确地“取消 Hook ”该事件。

防止这种泄漏的最佳方法是什么(如果确实有的话)?我是否应该保留我正在管理的元素的列表,并在 Application.Exit 事件中解开 PreviewKeyDown 事件?有没有人在自己的 WPF 应用程序中使用附加行为取得成功并提出了优雅的内存管理解决方案?

最佳答案

我不同意 DannySmurf

某些 WPF 布局对象可能会阻塞您的内存,并在未进行垃圾回收时使您的应用程序变得非常缓慢。所以我发现单词的选择是正确的,你正在将内存泄漏给你不再使用的对象。您希望这些项目被垃圾收集,但事实并非如此,因为在某处存在引用(在本例中是来自事件处理程序)。

现在有一个真正的答案:)

我建议你阅读这篇 WPF Performance article on MSDN

Not Removing Event Handlers on Objects may Keep Objects Alive

The delegate that an object passes to its event is effectively a reference to that object. Therefore, event handlers can keep objects alive longer than expected. When performing clean up of an object that has registered to listen to an object's event, it is essential to remove that delegate before releasing the object. Keeping unneeded objects alive increases the application's memory usage. This is especially true when the object is the root of a logical tree or a visual tree.

他们建议您查看 Weak Event pattern

另一种解决方案是在处理完对象后删除事件处理程序。但我知道,对于附加属性,这一点可能并不总是很清楚..

希望这会有所帮助!

关于.net - 使用附加行为防止内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061/

相关文章:

c# - 如果数据绑定(bind),如何将表单/字段标记为 "dirty"?

c# - 为具有抽象复杂类型的模式生成类

asp.net - 发布 : Could not find a part of the path …\obj\DEV\AspnetCompileMerge\Source\bin\roslyn\csc. exe'

c# - 如何以编程方式查找 WPF 扩展子项?

wpf - 打印 ScrollViewer 内容

c - 何时为 C 中的结构和 "create"函数分配内存

python - 如何解决这个内存错误 - python

c - 释放分配给 char* (由 `malloc` 分配)的 int* 是否会调用未定义的行为?

.net - 版本号是 1.13 > 1.2?

c# - 无法加载文件或程序集 WebMarkupMin.Core