Una perdita di memoria Ŕ in pu˛ di verificarsi quando si utilizza l'associazione dati in Windows Presentation Foundation

Traduzione articoli Traduzione articoli
Identificativo articolo: 938416 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si utilizza l'associazione dati in Microsoft Windows Presentation Foundation (WPF), pu˛ verificarsi una perdita di memoria.

Cause

Questo problema si verifica se le seguenti condizioni sono vere:
  • Un percorso di associazione dati fa riferimento a proprietÓ P dell'oggetto X.
  • Oggetto X contiene un riferimento diretto o un riferimento indiretto alla destinazione dell'operazione di associazione dati.
  • ProprietÓ P si avviene tramite un oggetto PropertyDescriptor invece dell'oggetto DependencyProperty o di un oggetto PropertyInfo .

Workaround

Per aggirare il problema, utilizzare uno dei seguenti metodi.

Metodo 1

Accedere a proprietÓ P tramite un oggetto DependencyProperty .

Metodo 2

Esporre l'interfaccia INotifyPropertyChanged su oggetto X.

Metodo 3

Impostare la modalitÓ dell'associazione dati per tale .

Status

Questo comportamento legato alla progettazione.

Informazioni

In WPF, le notifiche di modifica dall'oggetto di origine (oggetto X) un'operazione di associazione dati che non Ŕ stata contrassegnata come tale deve essere in ascolto per proprietÓ. WPF utilizza le notifiche predefinite della classe DependencyProperties o le notifiche dall'interfaccia INotifyPropertyChanged .

Se la classe DependencyProperties e l'interfaccia INotifyPropertyChanged non sono disponibili, in WPF viene utilizzato l'evento ValueChanged . Questo comportamento implica che chiama il metodo PropertyDescriptor.AddValueChanged sull'oggetto PropertyDescriptor che corrisponde alla proprietÓ P. Sfortunatamente, questa azione fa in modo il common language runtime (CLR) creare un riferimento forte da questo di per oggetto PropertyDescriptor X. CLR mantiene anche un riferimento all'oggetto PropertyDescriptor in una tabella globale. Questo comportamento causa una catena di riferimento si verifichi nell'ordine seguente:
  1. Tabella globale
  2. L'oggetto PropertyDescriptor
  3. Object X
  4. La destinazione di associazione dati

    Nota Il riferimento tra oggetto X e la destinazione di associazione dati Ŕ causato dalla prima condizione Ŕ elencata nella sezione "Cause".
  5. Associazione
PurchÚ la destinazione di associazione dati viene utilizzata, l'associazione deve continuare attendere le modifiche. Questo comportamento consente di mantenere il riferimento tra l'oggetto PropertyDescriptor e oggetto X e la destinazione rimane in uso. Questo comportamento causa una perdita di memoria nell'oggetto X e in ogni oggetto oggetto a cui fa riferimento X. Tali oggetti includono la destinazione di associazione dati.

Metodo soluzione 1 e di metodo soluzione 2 causare PRESENTATION per utilizzare uno dei meccanismi di notifica preferito. Metodo soluzione 3 indica WPF non per l'ascolto le notifiche di modifica. Tutti i metodi di soluzione tre evitare di creare il riferimento tra l'oggetto PropertyDescriptor e oggetto X.

Nell'esempio codice riportato di seguito, vengono create le condizioni per la perdita.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
in questo esempio di codice, la proprietÓ Count rappresenta la proprietÓ P. Inoltre, oggetto X Ŕ rappresentato dalla classe UIElementCollection sotto forma della proprietÓ StackPanel.Children .

La prima condizione nella sezione "Cause" viene soddisfatta perchÚ l'oggetto X fa riferimento ai figli dell'oggetto X. Questi elementi figlio sono la destinazione di associazione e la destinazione di associazione Ŕ l'elemento TextBlock .

La seconda condizione nella sezione "Cause" viene soddisfatta perchÚ la proprietÓ P non Ŕ un oggetto DependencyProperty e oggetto X non implementa l'interfaccia INotifyPropertyChanged . Questo comportamento, la classe UIElementCollection e l'elemento TextBlock non verranno rilasciati. Inoltre, la classe del contenitore StackPanel non viene rilasciata, poichÚ la classe UIElementCollection contiene un riferimento alla classe del contenitore StackPanel . Questo comportamento si verifica anche se la classe di UIElementCollection e l'elemento TextBlock viene rimosso dalla struttura principale utilizzando la seguente riga di code:
MyLabel.Content = <Some New Content>;

ProprietÓ

Identificativo articolo: 938416 - Ultima modifica: giovedý 26 luglio 2007 - Revisione: 1.1
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 3.0
Chiavi:á
kbmt kbtshoot kbprb KB938416 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 938416
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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