При использовании привязки данных в Windows Presentation Foundation может произойти утечка памяти

Переводы статьи Переводы статьи
Код статьи: 938416 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

При использовании привязки данных в Microsoft Windows Presentation Foundation (WPF), может произойти утечка памяти.

Причина

Эта проблема наблюдается, если выполняются указанные ниже условия.:
  • Привязка данных путь ссылается на свойствоP :объектаX :.
  • ОбъектX :содержит прямую ссылку или косвенную ссылку на место назначения операции привязки.
  • СвойствоP :осуществляется с помощьюPropertyDescriptorобъект, а неDependencyPropertyобъект илиPropertyInfoОбъект.

Временное решение

Для решения проблемы используйте один из указанных ниже способов..

Способ 1.

Доступ к свойствуP :черезDependencyPropertyОбъект.

Способ 2

ПредоставитьINotifyPropertyChangedинтерфейс для объектаX :.

Способ 3

Режим привязки данныхOneTime.

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

В операции привязки, который не помечен как WPFOneTimeдолжны прослушивать из исходного объекта (объект уведомления об изменении свойствX :). WPF использует встроенные уведомленияDependencyPropertiesкласс или уведомления отINotifyPropertyChangedи сканеров.

ЕслиDependencyPropertiesКласс аINotifyPropertyChangedинтерфейс недоступны, WPF используетValueChangedСобытие:. Это включает в себя вызовPropertyDescriptor.AddValueChangedметодPropertyDescriptorобъект, который связан со свойствомP :. К сожалению это действие приводит к общеязыковой среды выполнения (CLR), чтобы создать строгую ссылку из этогоPropertyDescriptorобъекта к объектуX :. Среда CLR также сохраняет ссылку наPropertyDescriptorОбъект глобальной таблицы. Это приводит к цепочке ссылок в следующем порядке:
  1. Глобальная таблица
  2. надписьюPropertyDescriptorОбъект
  3. ОбъектX :
  4. Цель привязки данных

    Примечание.Ссылка на объект X и целевого объекта привязки данных связана с первым условием, перечисленных в разделе «Причина».
  5. Привязка
До тех пор, пока используется целевого объекта привязки данных, для отслеживания изменений необходимо продолжить привязки. Это сохраняет ссылку на активность междуPropertyDescriptorобъект и объектX :, и целевой объект не используется. Это вызывает утечку памяти в объектеX :в каждый объект в объектX :содержит ссылку. Эти объекты включают целевого объекта привязки данных.

Метод обхода 1 и метод обхода 2 привести WPF использовать один из механизмов основной уведомления. Метод обхода 3 указывает, что WPF не для ожидания уведомления об изменениях. Все три метода обхода методы избегать создания ссылок междуPropertyDescriptorобъект и объектX :.

В следующем примере кода создаются условия для утечки.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
В этом примере кодаСчетчиксвойство представляет значение свойстваP :. Кроме того объектX :представленныйUIElementCollectionкласс в формеStackPanel.ChildrenСвойство.

Первое условие в разделе «Причина» выполнено, так как объектX :ссылается на дочерних объектов объектаX :. Эти дочерние элементы включают цели привязки и целью привязкиTextBlockЭлемент.

Второе условие, в разделе «Причина» выполнено, так как свойствоP :не являетсяDependencyPropertyобъект и объектX :не реализуетINotifyPropertyChangedи сканеров. Это приводит кUIElementCollectionКласс аTextBlockэлемент не освобождается. Кроме тогоStackPanelКласс контейнера не освобождается, так какUIElementCollectionкласс содержит ссылку наStackPanelКласс контейнера. Такое поведение наблюдается, даже еслиUIElementCollectionКласс аTextBlockудалить элемент из основного дерева, используя следующий код:
MyLabel.Content = <Some New Content>;

Свойства

Код статьи: 938416 - Последний отзыв: 28 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 3.0
Ключевые слова: 
kbtshoot kbprb kbmt KB938416 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:938416

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com