Ho un'applicazione WindowsForms che sembra perdere memoria, quindi ho usato ANTS Memory Profiler di Redgate per esaminare gli oggetti che sospetto e scoprire che sono trattenuti solo da oggetti già nella coda Finalizer. Fantastico, esattamente cos'è la coda di Finalizer? Puoi indicarmi la migliore definizione? Puoi condividere qualche consiglio aneddotico?Quali sono Finalization Queue e Control + ThreadMethodEntry?
Inoltre, tutti gli oggetti GC radice nella coda Finalizer sono istanze di oggetti System.Windows.Forms.Control + ThreadMethodEntry denominati "chiamante". Vedo che è coinvolto nell'interazione dell'interfaccia multi-thread, ma non ne so molto oltre. Perdona la mia apparente pigrizia e ammetto l'ignoranza, ma queste risorse sono tutte sepolte all'interno della componente di un venditore. Sto parlando al venditore di questi problemi, ma ho bisogno di qualche direzione per aggiornarmi sulla conversazione. Puoi indicarmi anche la definizione più utile di ThreadMethodEntry? Qualche consiglio aneddotico?
Inoltre, dovrei preoccuparmi anche di questi oggetti sulla coda del finalizzatore?
Aggiornamento: Questo Red Gate article è stato utile.
Grazie per l'ottima risposta, Paul. Questo è il grafico di riferimento dell'oggetto di cui sto parlando, guardando i nuovi oggetti nella seconda istantanea, dopo che le risorse dovrebbero essere pulite. Tutti gli oggetti nel grafico che implementano IDisposable hanno un suggerimento che dice "Dispose() è stato chiamato per questo oggetto" ma l'oggetto selezionato non ha tale tooltip. – flipdoubt
Nota su ThreadMethodEntry: Penso che vengano utilizzati in qualsiasi richiamo al thread dell'interfaccia utente. Ogni oggetto Control ha una coda di callback di thread di tipo ThreadMethodEntry. Un callback rimuove un ThreadMethodEntry e lo esegue. Ogni oggetto ThreadMethodEntry ha una serie di campi interni. Esaminare questi campi potrebbe aiutarti a capire quale di questi oggetti del fornitore sta invocando. Non ricordo se è possibile ottenere informazioni da ANTS, ma so che è possibile tramite WinDbg.dll e sos.dll (estensioni del debugger gestito). Guarda il delegato "metodo" e il controllo "chiamante". –
Inoltre, si noti che gli oggetti ThreadMethodEntry implementano un finalizzatore, ma non hanno un metodo Dispose. Quando si completano, anche loro verrebbero spostati nella coda del finalizzatore. –