Domanda

Mi sono imbattuto in questa eccezione ieri:

Win32Exception: Fehler beim Erstellen des Fensterhandles

si potrebbe tradurre:

Win32Exception: Error while creating the windowhandle

Io so come risolvere questo (anche scritto una breve post sul blog sul tema - in tedesco)

Ma io non so dove la mia domanda potrebbe essere 'perde' I controlli non disposti, che hanno ancora delle finestre maniglie.

C'è un modo di rilevare / trovare istanze che

  • implementare IDisposable
  • Hanno Parent == null

Oggetti corrispondenti a questi vincoli sembrano essere buoni candidati.

È stato utile?

Soluzione

Ogni memoria profiler decente vi mostrerà le istanze di controllo. Non saranno spazzatura raccolti, la loro proprietà Handle li tiene in vita. Ci saranno quasi 10.000 di loro. È anche possibile vederlo con Task Manager, utilizzare View + Seleziona colonne e zecche oggetti utente. Guardando l'aumento contano come si sta testando l'applicazione deve fornire un suggerimento decente.

Una revisione del codice dovrebbe andare un lungo cammino troppo, non ci sono molti modi possibili per fuoriuscire una finestra. Primo sguardo per il caso più comune, codice che chiama Controls.Clear () o Controls.Remove / A (), ma non anche smaltire il controllo. Successivo caso comune è la classe SystemEvents, si deve annullare l'iscrizione in modo esplicito i suoi eventi. Il resto non sono così facili da trovare, avresti bisogno che profiler.

Trovare le maniglie te stesso in fase di esecuzione è tecnicamente possibile con la riflessione. Le maniglie sono memorizzati in System.Internal.HandleCollector.handleTypes []. Beh, tecnicamente.

Altri suggerimenti

Ogni oggetto che implementa IDisposable ha un metodo Dispose. Questo metodo deve essere chiamato quando non è più necessario l'oggetto. E 'utilizzato in un solo metodo, circondarlo con una dichiarazione using (chiamate Dispose automaticamente). Se si tratta di una variabile membro della classe, la classe deve implementare IDisposable stessa. FxCop ha una regola di controllo per questo.

Se non vengono raccolti è perché qualche altro oggetto fa riferimento i controlli, né chiamare né smaltire impostazione genitore a nulla è sufficiente. Forse si collega a eventi e non dettaching da loro.

Controlla specialmente il caso di attribuire agli eventi provenienti da controlli non essere contenute dal attacher, in questo caso si deve sempre staccare dagli eventi per lo smaltimento dei controlli, se non il controllo continuerà ancora a cui fa riferimento l'attacher e quindi non sarà rilasciato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top