Ich habe eine WindowsForms App, die Speicher zu verlieren scheint, also habe ich Redgate ANTS Memory Profiler verwendet, um die Objekte zu betrachten, die ich vermute, und sie nur von Objekten bereits auf der Finalizer-Warteschlange gehalten werden. Großartig, genau was ist eine Finalizer-Warteschlange? Kannst du mich auf die beste Definition hinweisen? Kannst du irgendeinen anekdotischen Rat geben?Was sind die Finalizer Queue und Control + ThreadMethodEntry?
Außerdem sind alle Root-GC-Objekte in der Finalizer-Warteschlange Instanzen von System.Windows.Forms.Control + ThreadMethodEntry Objekten namens "caller". Ich sehe, dass es in Multi-Thread-UI-Interaktion beteiligt ist, aber ich weiß nicht viel darüber hinaus. Verzeihen Sie meine scheinbare Faulheit und gestandene Ignoranz, aber diese Ressourcen sind alle in der Komponente eines Verkäufers vergraben. Ich spreche mit dem Verkäufer über diese Probleme, aber ich brauche eine Anleitung, um mich auf dem Laufenden zu halten. Können Sie mich auf die nützlichste Definition von ThreadMethodEntry hinweisen? Irgendwelche anekdotische Ratschläge?
Sollte ich mich auch über diese Objekte in der Finalizer-Warteschlange Sorgen machen?
Aktualisierung: Diese Red Gate article war hilfreich.
Danke für die tolle Antwort, Paul. Das ist das Objekt-Referenzdiagramm, von dem ich spreche, und sehe neue Objekte im zweiten Snapshot an, nachdem die Ressourcen bereinigt werden sollen. Alle Objekte im Diagramm, die IDisposable implementieren, haben eine QuickInfo, die besagt, dass "Dispose() für dieses Objekt aufgerufen wurde", aber das ausgewählte Objekt hat keine solche QuickInfo. – flipdoubt
Hinweis zu ThreadMethodEntry: Ich denke, dass sie in jedem Invoke zum UI-Thread verwendet werden. Jedes Control-Objekt verfügt über eine Warteschlange mit Thread-Rückrufen vom Typ ThreadMethodEntry. Ein Rückruf entfernt einen ThreadMethodEntry und führt ihn aus. Jedes ThreadMethodEntry-Objekt hat eine Reihe interner Felder. Wenn Sie diese Felder untersuchen, können Sie möglicherweise herausfinden, welche Objekte dieses Lieferanten aufgerufen werden. Ich kann mich nicht erinnern, ob Sie diese Informationen von ANTS erhalten können, aber ich weiß, dass Sie über WinDbg.dll und sos.dll (verwaltete Debugger-Erweiterungen) können. Sehen Sie sich den Delegierten "method" und das Steuerelement "Anrufer" an. –
Beachten Sie außerdem, dass die ThreadMethodEntry-Objekte einen Finalizer implementieren, jedoch keine Dispose-Methode. Wenn sie fertig sind, werden sie ebenfalls in die Finalizer-Warteschlange verschoben. –