C# Liste aller Instanzen eines Objekts

OP #4900798
Hallo Zusammen,
ein Programm erstellt nach Bedarf Instanzen von einem Objekt.
1
ThreadWorker() 
2
{
3
if (Bedarf)
4
     MeinObject mo = new MeinObject();
5
}

Diese Objekte sind jeweils Teil eines Threads, der im Hindergrund läuft.


Meine Frage wäre gibt es eine Möglichkeit herauszufinden, wieviele 
dieser Objekte erstellt wurden um dann gezielt auf die Objekte zugreifen 
zu können und ggf. ein Objekt zerstören zu können?

Danke!
Gast #4900803
Bestimmt kommt man über Reflexion und die Runtime irgendwie an so eine 
Liste, aber das einfachste ist die Objekte einfach selber in einer Liste 
abzulegen.
#4906265
Per Reflection wird das nicht gehen, weil man dadurch nicht auf die 
internen Strukturen der CLR zugreifen kann, diese sind opak. Es können 
im Prinzip nur Typinformationen abgefragt und dynamischer Code 
ausgeführt werden.

Man kann es natürlich mit einer Liste machen, nur hat man dann 
allerdings das Problem, dass wenn man eine Instanz nach der Verwendung 
nicht wieder explizit aus der Liste entfernt durch die Objektreferenz 
ein Speicherleck entsteht - denn solange das Objekt von der Liste 
referenziert wird, kann es nicht vom GC bereinigt werden, auch wenn es 
schon lange nicht mehr benutzt wird. Eine Möglichkeit wäre, IDisposable 
zu implementieren und in der Dispose()-Methode die Instanz explizit 
wieder aus der Liste zu entfernen, aber auch das ist problematisch weil 
der Dispose-Aufruf nicht garantiert werden kann (wenn man z.B. keinen 
using-Block verwendet und den Aufruf vergisst) oder man nicht weiß, ob 
das Objekt an anderer Stelle noch benötigt wird. Höchstens per 
Destruktor (Finalizer), was sich allerdings negativ auf die Performance 
auswirken kann.

Das reine Zählen, wie viele Instanzen eines Objektes erstellt wurden, 
wäre noch relativ simpel über einen Zähler in einem statischen Feld, der 
im Konstruktor inkrementiert wird, zu lösen. Mit dem 
[ThreadStatic]-Attribut wahlweise auch per Thread.

Wenn man schon eine Liste nimmt, dann bitte mit schwachen Referenzen (so 
genannte "Weak List"). Generell sollte man solche Konstrukte eher meiden 
und versuchen die behandelte Problematik anders zu lösen. Vor allem in 
Multi-Thread-Szenarien. Threadübergreifende Objekte, sofern nicht 
immutable, sind immer schwierig zu handhaben. Und List<T> ist auch nicht 
threadsicher!
#4907101
C# Entwicker schrieb:
> https://msdn.microsoft.com/en-us/library/dd381779(...

Schon klar, das ändert aber trotzdem nichts an der Tatsache eines 
möglichen Speicherlecks durch verwaiste Referenzen in der Liste.

Vielleicht habe ich allerdings auch die ursprüngliche Fragestellung 
nicht ganz richtig erfasst...

> Diese Objekte sind jeweils Teil eines Threads, der im Hindergrund läuft."

Tja, ich bin irgendwie automatisch von einer threadübergreifenden Liste 
ausgegangen. Wenn die Liste nun auf einen Thread beschränkt ist, wird 
die Sache natürlich weniger problematisch, dann kann man auch die 
normale Liste nehmen und wenn die am Ende nicht mehr irgendwo 
referenziert wird, ist alles in Butter. :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.