Detectar vazamentos WindowHandle num # aplicativo c
-
19-09-2019 - |
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.
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