当您在 Windows 演示基础使用数据绑定时,可能会发生内存泄漏

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 938416
症状
当您使用数据绑定在 Microsoft Windows 演示基础 (适用于 WPF) 时,可能会发生内存泄漏。
原因
如果满足下列条件,则会出现此问题:
  • 数据绑定的路径是指对象 XP 属性。
  • 对象 X 包含直接引用或间接引用了数据绑定操作的目标。
  • 通过 PropertyDescriptor 对象而不是一个 DependencyProperty 对象或 $ PropertyInfo 对象的访问属性 P
替代方法
要变通解决此问题,使用下列方法之一。

方法 1

通过 DependencyProperty 对象访问属性 P

方法 2

公开对象 X 上的 INotifyPropertyChanged 接口。

方法 3

将数据绑定的模式设置为 OneTime
状态
此行为是设计使然。
更多信息
在 WPF 中,不标记为 OneTime 必须侦听属性的一个数据绑定操作从源对象 (对象 X) 更改通知。 WPF 从 INotifyPropertyChanged 界面使用 DependencyProperties 类的内置通知。

如果 DependencyProperties 类和 INotifyPropertyChanged 接口都不可用,WPF 使用 ValueChanged 事件。 此行为涉及到与属性 P 相对应的 PropertyDescriptor 对象上调用 PropertyDescriptor.AddValueChanged 方法。 遗憾的是,此操作会导致公共语言运行库 (CLR) 可以创建从此 PropertyDescriptor 对象 X 的强引用。 CLR 还保留全局表中的 PropertyDescriptor 对象的引用。 此行为会导致引用链以下列顺序发生:
  1. 全局表
  2. PropertyDescriptor 对象
  3. Object X
  4. 数据绑定目标

    注意该对象 X 和数据绑定目标之间的引用是由"原因"部分中列出的第一个条件引起的。
  5. 绑定
只要使用数据绑定目标,绑定必须继续侦听的更改。 此行为使引用之间 PropertyDescriptor 对象处于活动状态和对象 X,并且目标仍保留在使用中。 对象 XX 所引用的对象的每个对象中,此行为将导致内存泄漏。 这些对象包括数据绑定目标。

解决方法 1 和解决方法方法 2 导致 WPF 使用首选的通知机制之一。 解决方法方法 3 指示 WPF 不为侦听的更改通知。 所有三种解决方法方法避免创建之间 PropertyDescriptor 对象引用和对象 X

在下面的代码示例创建了泄漏的条件
<Label Name="MyLabel">   <Stack Panel Name="MyStackPanel">      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />   </StackPanel></Label>
此的代码示例在 Count 属性表示属性 P。此外,对象 X 表示由 UIElementCollectionStackPanel.Children 属性的窗体中的类。

在"原因"部分中的第一个条件得到满足,因为对象 X 所引用对象 X 的子级的。这些子项包括绑定目标和绑定目标是 TextBlock 元素。

在"原因"部分中的第二个条件得到满足,因为属性 P 不是一个 DependencyProperty 对象和对象 X 不实现 INotifyPropertyChanged 接口。 此行为将导致 UIElementCollection 类和 TextBlock 元素不能发布。 此外,StackPanel 容器类不是释放,因为 UIElementCollection 类包含 StackPanel 容器类的引用。 即使 UIElementCollection 类和 TextBlock 元素从主树删除通过使用下面的 code:
MyLabel.Content = <Some New Content>;

警告:本文已自动翻译

属性

文章 ID:938416 - 上次审阅时间:07/26/2007 16:07:51 - 修订版本: 1.1

Microsoft .NET Framework 3.0

  • kbmt kbtshoot kbprb KB938416 KbMtzh
反馈