Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

Une fuite de mémoire peut se produire lorsque vous utilisez la liaison de données dans Windows Presentation Foundation

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 938416
Symptômes
Lorsque vous utilisez la liaison de données dans Microsoft Windows Presentation Foundation (WPF), une fuite de mémoire peut se produire.
Cause
Ce problème se produit si les conditions suivantes sont remplies :
  • Un chemin de liaison de données fait référence à la propriété P d'objet X.
  • Objet X contient une référence directe ou une référence indirectement à la cible de l'opération de liaison de données.
  • Propriété P est accessible via un objet PropertyDescriptor au lieu d'un objet DependencyProperty ou un objet PropertyInfo .
Contournement
Pour contourner ce problème, appliquez l'une des méthodes suivantes.

Méthode 1

Accéder à propriété P via un objet DependencyProperty .

Méthode 2

Expose l'interface INotifyPropertyChanged sur objet X.

Méthode 3

Définir le mode de la liaison de données à OneTime .
Statut
Ce comportement est voulu par la conception même du produit.
Plus d'informations
Dans WPF, une opération de liaison de données qui n'est pas marquée comme OneTime doit écouter de la propriété modifier les notifications de l'objet source (objet X). WPF utilise les notifications de la classe DependencyProperties intégrées ou les notifications de l'interface INotifyPropertyChanged .

Si la classe DependencyProperties et l'interface INotifyPropertyChanged ne sont pas disponibles, WPF utilise l'événement ValueChanged . Ce problème implique l'appelant la méthode PropertyDescriptor.AddValueChanged sur l'objet PropertyDescriptor qui correspond à la propriété P. Malheureusement, cette action provoque le common language runtime (CLR) créer une référence forte à partir de cet objet à PropertyDescriptor X. Le CLR conserve également une référence à l'objet PropertyDescriptor dans un tableau global. Ce comportement provoque une chaîne de référence dans l'ordre suivant :
  1. Tableau global
  2. L'objet PropertyDescriptor
  3. Object X
  4. La cible de liaison de données

    note La référence entre objet X et la liaison de données cible est provoquée par la première condition est répertoriée dans la section « Cause ».
  5. La liaison
Tant que la cible de liaison de données est utilisée, la liaison doit continuer à écouter les modifications. Ce comportement conserve la référence actif entre l'objet PropertyDescriptor et objet X et la cible reste en cours d'utilisation. Ce comportement provoque une fuite de mémoire dans objet X et dans chaque objet à l'objet X se réfère. Ces objets incluent la cible de liaison de données.

Méthode de contournement 1 et méthode de contournement 2 entraîner WPF utiliser une des mécanismes de notification par défaut. Méthode de contournement 3 indique à WPF ne pas pour écouter les notifications de changement. Toutes les méthodes de solution de contournement trois évitez de créer la référence entre l'objet PropertyDescriptor et objet X.

Dans l'exemple de code suivant, les conditions de la fuite sont créées.
<Label Name="MyLabel">   <Stack Panel Name="MyStackPanel">      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />   </StackPanel></Label>
Dans cet exemple de code, la propriété Count représente la propriété P. En outre, objet X est représenté par la classe UIElementCollection sous la forme de la propriété StackPanel.Children .

La première condition dans la section « Cause » est satisfaite parce que l'objet X fait référence pour les enfants de l'objet X. Ces comprennent la cible de liaison et la cible de liaison est l'élément TextBlock .

La deuxième condition dans la section « Cause » est remplie car la propriété P n'est pas un objet DependencyProperty et objet X n'implémente pas l'interface INotifyPropertyChanged . Ce comportement provoque la classe UIElementCollection et l'élément TextBlock ne pas à lancer. En outre, la classe de conteneur StackPanel n'est publiée, car la classe UIElementCollection contient une référence à la classe de conteneur StackPanel . Ce problème se produit même si la classe UIElementCollection et l'élément TextBlock sont supprimés de l'organigramme principal à l'aide de la ligne suivante de code:
MyLabel.Content = <Some New Content>;

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 938416 - Dernière mise à jour : 07/26/2007 16:07:51 - Révision : 1.1

Microsoft .NET Framework 3.0

  • kbmt kbtshoot kbprb KB938416 KbMtfr
Commentaires
=">