Was ist der Umfang des Finalizer-Threads - pro Anwendungsdomäne oder pro Prozess?

Basierend auf all meinen Lesungen sollte es einen GC-Thread geben, um alle Finalizer aufzurufen. Nun stellt sich die Frage, welchen Umfang dieser "eine" Thread hat - pro Prozess oder pro Anwendungsdomäne, da die gesamte Absicht der Domänen darin besteht, verschiedene Anwendungen in einem Prozessraum zu trennen und "unabhängig" zu machen.

ich leseHier:

Wenn in einem Finalizer eine nicht behandelte Ausnahme auftritt, wird die Ausnahme vom ausführenden Thread der CLR verschluckt. Behandeln Sie den Finalizer als normal abgeschlossen, entfernen Sie ihn aus der Warteschlange, und fahren Sie mit dem nächsten Eintrag fort.

Schwerwiegender ist jedoch, was passiert, wenn Ihr Finalizer aus irgendeinem Grund nicht beendet wird, z. B. blockiert und auf eine Bedingung wartet, die niemals eintritt.In diesem Fall wird der Finalizer-Thread aufgehängt, sodass keine finalisierbaren Objekte mehr als Müll gesammelt werden. Sie sollten sich dieser Situation sehr bewusst sein und den einfachsten Code schreiben, um Ihre nicht verwalteten Ressourcen in Finalizern freizugeben.

Eine weitere Überlegung ist, was beim Herunterfahren der Anwendung geschieht. Wenn das Programm beendet wird, versucht der Garbage Collector, die Finalizer aller finalisierbaren Objekte aufzurufen, jedoch mit bestimmten Einschränkungen:

Finalisierbare Objekte werden beim Herunterfahren nicht zu höheren Heap-Generationen heraufgestuft.

Jeder einzelne Finalizer hat maximal 2 Sekunden Zeit, um ausgeführt zu werden. Wenn es länger dauert, wird es getötet.

Es gibt maximal 40 Sekunden, bis alle Finalizer ausgeführt sind. Wenn noch Finalizer ausgeführt werden oder noch ausstehen, wird der gesamte Prozess abrupt abgebrochen.

Zu viele Posts (und sogar offizielle Dokumentationen) missbrauchen die Begriffe "Anwendung", "Prozess" und "Anwendungsdomäne" - die meisten davon gehen sogar davon aus, dass sie gleich sind, da Anwendungen in der Regel in einer einzigen Anwendungsdomäne in einem einzigen Prozess ausgeführt werden . Dieser Missbrauch macht all diese Dokumente schwer lesbar und nicht einmal nützlich.

Meine Frage geht also davon aus, dass mehr als eine Anwendung in einer separaten Anwendungsdomäne in einem einzigen Prozess ausgeführt wird.

Haben alle diese Anwendungen dieselben GC- und Finalizer-Threads? Beeinträchtigt das im obigen Artikel beschriebene Problem (hängt Finalizer-Thread) alle Anwendungen in diesem Prozess? Wenn ja - gibt es eine Problemumgehung (abgesehen davon, keine schlechten Anwendungen zu verwenden), wie den Finalizer-Thread irgendwie zu entdecken und ihn zu versenden Thread.Abort?

Alles oben ist, weil ich ein ähnliches Problem habe. Meine Anwendung wird in einer separaten Anwendungsdomäne als Add-In für Software von Drittanbietern (Outlook) ausgeführt. Aus verschiedenen Gründen muss ich GC.Collect und GC.WaitForPendingFinalizers aufrufen, um COM-Verweise vollständig freizugeben (die üblichen Interop-Routinen reichen für Office / Outlook nicht aus). Wenn ein bestimmtes Add-In eines Drittanbieters ausgeführt wird, bleibt mein GC.WaitForPendingFinalizers für immer hängen Ich vermute also, dass es einen "schlechten" Finalizer in diesem Drittanbieter gibt, der hinzufügt. Ich habe keine Kontrolle über das Ersetzen / Entfernen dieses Hinzufügens (Kundenanforderung), daher muss ich selbst herausfinden, wie sie nebeneinander existieren können.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage