Pergunta

Eu corri para essa exceção ontem:

Win32Exception: Fehler beim Erstellen des Fensterhandles

pode traduzir:

Win32Exception: Error while creating the windowhandle

Eu sei como resolver isso (mesmo escreveu um curto blogue post sobre o tema - em alemão)

Mas eu não sei onde meu aplicativo pode ser 'vazamento' Controles não dispostos, que ainda tem janelas de alças.

Existe alguma maneira de detectar / encontrar instâncias que

  • implementar IDisposable
  • Have Parent == null

Objetos desse restrições parecem ser bons candidatos.

Foi útil?

Solução

Qualquer profiler de memória decente irá mostrar-lhe as instâncias de controle. Eles não vão ser lixo coletado, sua propriedade Handle os mantém vivos. Haverá perto de 10.000 deles. Você também pode vê-lo com o Gerenciador de Tarefas, use Ver + Selecionar colunas e marque objetos de usuário. Observando o aumento da contagem como você está testando o aplicativo deve fornecer uma dica decente.

A revisão do código deve percorrer um longo caminho também, não há que muitas maneiras possíveis para vazar uma janela. Primeiro olhar para o caso mais comum, código que chama Controls.Clear () ou Controls.Remove / A (), mas não também dispor de controle. caso comum próxima é a classe SystemEvents, você tem que desassociar explicitamente seus eventos. O resto não são tão fáceis de encontrar, você precisa que profiler.

Encontrar as alças se em tempo de execução é tecnicamente possível com reflexão. As alças são armazenados em System.Internal.HandleCollector.handleTypes []. Bem, tecnicamente.

Outras dicas

Cada objeto que implementa IDisposable tem um método Dispose. Este método deve ser chamado quando o objeto não é mais necessária. É usado em um único método só, cercá-la com uma declaração using (chamadas Dispose automaticamente). Se é uma variável de membro de sua classe, a classe deve implementar IDisposable si. FxCop tem uma regra de verificação para isso.

Se eles não são recolhidos é porque algum outro objeto faz referência a seus controles, nem chamar dispor nem configuração pai para nulo é suficiente. Talvez você está anexando a eventos e não destaquei a partir deles.

Verifique especialmente o caso de anexar a eventos de controles não ser contidos pelo attacher, neste caso, você deve sempre separar os eventos ao descartar os controles, se não o controle ainda continuará a ser referenciado pelo attacher e, assim, ele não será liberado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top