Weak references no C#

Se houver na sua aplicação objetos que consomem muita memória (imagens, sons, resultados de consultas grandes ao banco de dados, etc) mas que podem ser facilmente construídos novamente, pode ser interessante utilizar Weak references para mantê-los, e desta forma, diminuir o consumo de memória da aplicação.

Um objeto criado com este tipo de referência pode ser coletado pelo Garbage Collector a qualquer momento, mas como o GC não realiza a coleta sempre (a coleta pode ser feita imediatamente após a criação da referência ou vários minutos depois), a utilização destas referências é útil.

Exemplo de código:

// Field da classe
private WeakReference objWeakReference;

// Construtor
public ClasseTeste()
{
  // Considerando que objetos da ClasseA consomem muita memória
   ClasseA obj = CriaClasseA();
   objWeakReference = new WeakReference(obj);
}
(...)
public void UtilizaClasseA()
{
  ClasseA obj = objWeakReference.Target as ClasseA;

  // Se obj não tiver sido coletado, o seu valor não será nulo
  if (obj == null)
  {
    obj = CriaClasseA();
    objWeakReference .Target = obj;
  }
  (...)
}

Uma das formas de utilizar mais interessantes é quando se constrói cache de objetos utilizando dicionários. No artigo do link abaixo, o autor explica como construir um dicionário genérico para armazenar os objetos com referências fracas:

http://blogs.msdn.com/b/jaredpar/archive/2009/03/03/building-a-weakreference-hashtable.aspx

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s