Uma fuga de memória pode ocorrer quando utiliza vinculação de dados no Windows Presentation Foundation

Traduções de Artigos Traduções de Artigos
Artigo: 938416 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utiliza o enlace de dados no WPF (Microsoft Windows Presentation Foundation), poderá ocorrer uma fuga de memória.

Causa

Este problema ocorre caso se verifiquem as seguintes condições:
  • Um caminho de ligação de dados faz referência à propriedade P do objecto X.
  • Objecto X contém uma referência directa ou uma referência indirecta ao destino da operação de vinculação de dados.
  • Propriedade P é acedida através de um objecto PropertyDescriptor em vez de um objecto DependencyProperty ou um objecto PropertyInfo .

Como contornar

Para contornar este problema, utilize um dos seguintes métodos.

Método 1

Aceder a propriedade P através de um objecto DependencyProperty .

Método 2

Expõe a interface INotifyPropertyChanged no objecto X.

Método 3

Defina o modo da ligação de dados para OneTime .

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

No WPF, uma operação de vinculação de dados que não está marcada como OneTime deve aguardar propriedade Alterar notificações do objecto de origem (objecto X). O WPF utiliza as notificações da classe DependencyProperties incorporadas ou as notificações da interface INotifyPropertyChanged .

Se a classe DependencyProperties e a interface INotifyPropertyChanged não estiverem disponíveis, o WPF utiliza o evento ValueChanged . Este comportamento implica chamar o método PropertyDescriptor.AddValueChanged no objecto PropertyDescriptor que corresponde à propriedade P. Infelizmente, esta acção faz com que o common language runtime (CLR) criar uma referência forte deste objecto ao objecto de PropertyDescriptor X. O CLR também mantém uma referência ao objecto PropertyDescriptor numa tabela global. Este comportamento faz com que uma cadeia de referência ocorrer na seguinte ordem:
  1. Tabela global
  2. O objecto PropertyDescriptor
  3. Object X
  4. O destino de ligação de dados

    Nota A referência entre objecto X e a ligação de dados de destino é causada pela primeira condição listada na secção "Causa".
  5. Enlace
Desde que o destino de ligação de dados é utilizado, o enlace tem de continuar escutar alterações de. Este comportamento mantém a referência activa entre o objecto PropertyDescriptor e objecto X e de destino permanece em utilização. Este comportamento faz com que uma fuga de memória em objecto X e em todos os objectos para o objecto refere-se X. Estes objectos incluem o destino de ligação de dados.

Método alternativo 1 e método alternativo 2 causar WPF utilizar um dos mecanismos de notificação preferencial. Método alternativo 3 indica WPF não para receber notificações de alterações. Todos os métodos de solução três Evite criar a referência entre o objecto PropertyDescriptor e objecto X.

No exemplo de código seguinte, as condições para a fuga são criadas.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
neste exemplo de código, a propriedade Count representa a propriedade P. Além disso, o objecto X é representado pela classe UIElementCollection sob a forma da propriedade StackPanel.Children .

A primeira condição na secção "Causa" for obedecida porque o objecto X refere-se para os subordinados do objecto X. Estes crianças incluem o destino de enlace e o destino de enlace é o elemento TextBlock .

A segunda condição na secção "Causa" for obedecida porque propriedade P não é um objecto DependencyProperty e objecto X não implementa a interface INotifyPropertyChanged . Este comportamento faz com que a classe UIElementCollection e o elemento TextBlock não devem ser lançadas. Além disso, a classe de contentor StackPanel não é libertada, porque a classe UIElementCollection contém uma referência para a classe de contentor StackPanel . Este comportamento ocorre mesmo se a classe UIElementCollection e o elemento TextBlock são removidos da árvore principal utilizando a seguinte linha de code:
MyLabel.Content = <Some New Content>;

Propriedades

Artigo: 938416 - Última revisão: 26 de julho de 2007 - Revisão: 1.1
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 3.0
Palavras-chave: 
kbmt kbtshoot kbprb KB938416 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 938416

Submeter comentários

 

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