Wenn Sie die Datenbindung in Windows Presentation Foundation verwenden, kann ein Speicherleck auftreten

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 938416 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn Sie die Datenbindung in Microsoft Windows Presentation Foundation (WPF) verwenden, kann ein Speicherleck auftreten.

Ursache

Dieses Problem tritt auf, wenn die folgenden Bedingungen erfüllt sind:
  • Ein Data-Binding-Pfad bezieht sich auf die Eigenschaft P des Objekts X.
  • Objekt X enthält einen direkten Verweis oder einen indirekten Verweis auf das Ziel der Data-Binding-Vorgang.
  • Eigenschaft P erfolgt über eine PropertyDescriptor anstelle von Objekt ein "DependencyProperty" Objekt oder eine PropertyInfo -Objekt.

Abhilfe

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen.

Methode 1

Access-Eigenschaft P durch einen DependencyProperty -Objekt.

Methode 2

INotifyPropertyChanged -Schnittstelle für Objekt verfügbar machen X.

Methode 3

Stellen Sie den Modus der Datenbindung an OneTime.

Status

Dieses Verhalten ist beabsichtigt.

Weitere Informationen

In WPF ist ein Data-Binding-Vorgang, der nicht als gekennzeichnet ist OneTime für Benachrichtigungen über Eigenschaftenänderungen aus dem Quellobjekt (Objekt muss überwacht werden. X). WPF verwendet die integrierten Benachrichtigungen der DependencyProperties -Klasse oder die Benachrichtigungen von der INotifyPropertyChanged -Schnittstelle.

Wenn die DependencyProperties -Klasse und die INotifyPropertyChanged -Schnittstelle verfügbar sind, verwendet WPF das ValueChanged -Ereignis. Dieses Verhalten umfasst das Aufrufen der PropertyDescriptor.AddValueChanged -Methode für das PropertyDescriptor -Objekt, das die Eigenschaft entspricht P. Leider führt diese Aktion die common Language Runtime (CLR) einen starken Verweis von diesem PropertyDescriptor Objekt zu Objekt erstellen X. Die CLR behält einen Verweis auf das Objekt PropertyDescriptor auch in eine globale Tabelle. Dieses Verhalten führt zu eine Kette Verweis in der folgenden Reihenfolge auftreten:
  1. Globale Tabelle
  2. Die PropertyDescriptor Objekt
  3. Objekt X
  4. Das Ziel der Datenbindung

    Hinweis Die Referenz zwischen Objekt X und dem Ziel die Datenbindung entsteht durch die erste Bedingung, die im Abschnitt "Ursache" aufgeführt ist.
  5. Bindung
Solange das Ziel die Datenbindung verwendet wird, muss die Bindung weiterhin auf Änderungen überwachen. Dieses Verhalten bleibt den Verweis zwischen den PropertyDescriptor -Objekt und Objekt X, und das Ziel bleibt, verwendet. Dieses Verhalten verursacht einen Speicherverlust in Objekt X und in jedes Objekt, welches Objekt X verweist. Zu diesen Objekten gehören das Ziel für die Datenbindung.

Hilfsverfahren 1 und Hilfsverfahren 2 dazu führen, dass WPF, eine bevorzugte Benachrichtigungsmechanismen zu verwenden. Methode 3 der Problemumgehung weist WPF nicht zu hören für Änderungsbenachrichtigungen. Alle drei Workarounds zu vermeiden, erstellen die Referenz zwischen den PropertyDescriptor -Objekt und Objekt X.

Im folgenden Codebeispiel werden die Bedingungen für den Speicherverlust erstellt.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
In diesem Codebeispiel wird darstellt die Count -Eigenschaft die Eigenschaft P. Darüber hinaus Objekt X wird durch UIElementCollection -Klasse in der Form der StackPanel.Children -Eigenschaft dargestellt.

Im Abschnitt "Ursache" die erste Bedingung ist erfüllt, da Objekt X bezieht sich auf die untergeordneten Elemente des Objekts X. Diese untergeordneten Elemente enthalten das Bindungsziel und Bindungsziel TextBlock -Elements ist.

Im Abschnitt "Ursache" die zweite Bedingung ist erfüllt, weil-Eigenschaft P ist keiner DependencyProperty -Objekt und Objekt X implementiert die INotifyPropertyChanged -Schnittstelle nicht. Dieses Verhalten bewirkt, dass die UIElementCollection -Klasse und der TextBlock -Element, die nicht freigegeben werden. StackPanel -Container-Klasse wird außerdem nicht freigegeben, da die UIElementCollection -Klasse einen Verweis auf den StackPanel -Container-Klasse enthält. Dieses Verhalten tritt auf, auch wenn die UIElementCollection -Klasse und der TextBlock -Element aus der Hauptstruktur entfernt werden, mithilfe der folgenden Codezeile:
MyLabel.Content = <Some New Content>;

Eigenschaften

Artikel-ID: 938416 - Geändert am: Freitag, 29. März 2013 - Version: 3.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 3.0
Keywords: 
kbtshoot kbprb kbmt KB938416 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 938416
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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