Benutzer mit den meisten Antworten
System.ObjectDisposedException: Auf das verworfene Objekt kann nicht zugegriffen werden.

Frage
-
Hallo zusammen,
kann mir jmd einen Tip geben wie ich diesen Fehler reparieren kann?
Ich hab in einem anderen Forum gelesen dass hier eine Referenz auf das Objekt fehlt. Wie kann ich das checken ob die Referenz da ist, bzw wenn keine Referenz mehr da ist, wie bekomme ich die dann?Sry für die Noob-Fragen, aber ich bin noch ziemlich neu in C# und kenn mich hier nicht sonderlich gut aus.
Ich verwende VS2005.Danke schon mal.
Antworten
-
Nicht richtig, aber auch nicht total falsch.Mit dem Aufruf von Dispose wird dem Objekt gesagt, dass es nicht mehr gebraucht wird. Üblicherweise beinhaltet Dispose auch eine Mitteilung an den Garbage Collector, dass er den Finalizer beim Aufräumen nicht mehr aufzurufen braucht, da Dispose alle Aufräumarbeiten erledigt hat. Um Dispose aufzurufen, braucht man auch einen Objektverweis. Solange es diesen Objektverweis noch gibt, macht der Garbage Collector auch nichts mit dem Objekt. Sobald es aber keinen Objektverweis mehr gibt (Gültigkeitsbereich der Variablen wurde verlassen oder Variableninhalt wurde auf null gesetzt), kann der Garbage Collector den Speicherplatz ohne zusätzliche Aktivitäten (Aufruf Finalizer) freigeben (Objekt vernichten). Solange es aber noch einen Objektverweis gibt (eine gültige Variable mit Verweis auf das Objekt), kann man auch das Objekt nutzen. Nur nach dem Dispose verweigert das Objekt üblicherweise die Nutzung, da wegen Dispose alle Innereien keinen sinnvollen Zustand mehr haben. Am Beispiel eines Objektes, welches eine Datei nutzt (z.B. Logger) kann man das am deutlichsten erklären. Im Contructor wird die Datei geöffnet und im Dispose der Puffer ausgegeben und die Datei geschlossen. Jede weitere Nutzung (z.B. Write) ist damit unmöglich und dementsprechend sinnlos.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 27. Dezember 2011 12:50
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 29. Dezember 2011 10:34
-
Sorry für die späte Antwort, aber ich war im Urlaub.
Das hat mir sogar sehr weiter geholfen, bin drauf gekommen. Ein "this.close" war an einer Stelle zu viel. Vielen Dank für die Erklärungen :)
mir doch egal wer du bist, wenn ich hier angle läuft keiner übers wasser :)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 3. Januar 2012 09:35
Alle Antworten
-
Es ist nicht die Referenz die fehlt. Diese hast Du. Wenn Du sie nicht hättest, könntest Du auch nicht auf das Objekt zugreifen und den Fehler bekommen.Die Fehlerausschrift sagt aus, dass Dispose aufgerufen wurde und sich das Objekt danach in einem undefinierten bzw. nicht mehr funktionsfähigem Zustand befindet. Wenn das Objekt beispielsweise im Konstruktor eine Datei öffnet und dann im Dispose diese Datei schließt, würde eine spätere Nutzung von beispielsweise Write zu einem Fehler führen.--
Viele Gruesse
Peter -
Ah ok, macht Sinn. Da die FM an mehreren Stellen kommt die das Objekt aufrufen wurde das wohl entfernt. Dann such ich mal nach einem Dispose()
Nur um das richtig zu verstehen: Dipose löscht weder das Objekt, noch die Referenz drauf. Aber es lässt das Objekt in einem undefinierten Zustand. Richtig oder total falsch?
mir doch egal wer du bist, wenn ich hier angle läuft keiner übers wasser :) -
Nicht richtig, aber auch nicht total falsch.Mit dem Aufruf von Dispose wird dem Objekt gesagt, dass es nicht mehr gebraucht wird. Üblicherweise beinhaltet Dispose auch eine Mitteilung an den Garbage Collector, dass er den Finalizer beim Aufräumen nicht mehr aufzurufen braucht, da Dispose alle Aufräumarbeiten erledigt hat. Um Dispose aufzurufen, braucht man auch einen Objektverweis. Solange es diesen Objektverweis noch gibt, macht der Garbage Collector auch nichts mit dem Objekt. Sobald es aber keinen Objektverweis mehr gibt (Gültigkeitsbereich der Variablen wurde verlassen oder Variableninhalt wurde auf null gesetzt), kann der Garbage Collector den Speicherplatz ohne zusätzliche Aktivitäten (Aufruf Finalizer) freigeben (Objekt vernichten). Solange es aber noch einen Objektverweis gibt (eine gültige Variable mit Verweis auf das Objekt), kann man auch das Objekt nutzen. Nur nach dem Dispose verweigert das Objekt üblicherweise die Nutzung, da wegen Dispose alle Innereien keinen sinnvollen Zustand mehr haben. Am Beispiel eines Objektes, welches eine Datei nutzt (z.B. Logger) kann man das am deutlichsten erklären. Im Contructor wird die Datei geöffnet und im Dispose der Puffer ausgegeben und die Datei geschlossen. Jede weitere Nutzung (z.B. Write) ist damit unmöglich und dementsprechend sinnlos.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 27. Dezember 2011 12:50
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 29. Dezember 2011 10:34
-
Hi phil79,
wenn das Dispose richtig Implementiert ist, gibt es Ressourcen und/oder nicht verwalteter Code wieder frei.
Ressourcen können z.B. zugriffe auf eine Datei sein.
Bei nicht verwalteter Code könnte es sich durchaus um Objekte handeln, die dann auch weggeräumt werden.
Man kann dann also nicht mehr auf die Ressourcen oder den nicht verwalteten Code zugreifen.
(.NET) Verwaltete Objekte auf die kein Verweis mehr besteht, werden vom Gabage Collector (GC) weggeräumt, wenn er läuft.
Da der GC aber nicht zu einem Festgelegten Zeitpunkt läuft, sondern in Abhängigkeit von verschiedenen Parametern, kann man nicht genau sagen wann der Speicher freigeräumt wird. (Das Objekt gelöscht wird)
Klassen die ein Dispose enthalten, müssen laut MSDN Dokumentation auch einen Finalize Methode Implementieren.
Die Finalize Methode wird, dann vom GC aufgerufen wenn vom Programmierer vergessen wurde Dispose aufzurufen oder eine Exeption es verhindert.
Grundlegend bietet sich an für Objekte die ein Dispose haben das Using Statement zu verwenden.
Das Using Statement sorgt dafür, dass das Dispose auf jeden Fall ausgeführt wird.
Ein kleiner Hinweis noch, mit GC.Collect kann zwar der GC gestartet werden.
Aber nach Aussage des GC Programmieres sollte es auf keinen Fall aufgerufen werden.
Da hier mit massiven Performance Einbußen zu rechnen ist.
Mit freundlichen Grüßen
Björn
-
Hallo phil79,
Hat Dir die Antwort geholfen?
Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo phil79,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Sorry für die späte Antwort, aber ich war im Urlaub.
Das hat mir sogar sehr weiter geholfen, bin drauf gekommen. Ein "this.close" war an einer Stelle zu viel. Vielen Dank für die Erklärungen :)
mir doch egal wer du bist, wenn ich hier angle läuft keiner übers wasser :)- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 3. Januar 2012 09:35