2016-07-15 30 views
0

Ich kann mich nicht genau erinnern, aber ich habe vor einiger Zeit einen Fehler wie "object disposed exception" bekommen, während ich meine App getestet und geschlossen habe. Muss ich jedes Objekt manuell entsorgen? Oder was ist die richtige Art, Steuerelemente/Objekte zu verwenden?Warum wird die Klasse beim Verlassen der Anwendung nicht entsorgt?

Der Fehler angezeigt diese Zeile in Hauptform:

Private th As New SellerTimerHandler 

ich diesen Fehler kaum (ich es nicht testen kann), so frage ich mich, allgemeine Idee unnötig im Speicher beansprucht Platz zu vermeiden, nicht nur, wenn Ausführen und Schließen aber auch nach Abstürzen.

Antwort

1

Ein System.ObjectDisposedException wird geworfen, wenn Sie versuchen, auf ein Objekt zuzugreifen, das bereits entsorgt wurde. Die Ausnahme hat nichts damit zu tun, dass eine Klasse/ein Objekt nicht entsorgt wird.

Wenn Ihre Anwendung geschlossen wird, müssen Sie nichts mit ihren Objekten/Ressourcen tun, da Windows das für Sie übernimmt. Das Entsorgen und Sammeln von Objekten muss nur während der Laufzeit durchgeführt werden, um Speicher freizugeben, damit die Anwendung weiter betrieben werden kann und um nicht den gesamten Arbeitsspeicher zu verbrauchen.

Wenn ein Prozess ausgeführt wird, hat das Betriebssystem volle Kenntnisse über alle die Systemressourcen, die es verwendet; was bedeutet, dass wenn der Prozess tatsächlich schließt, das OS einfach den gesamten von ihm verwendeten Speicher freigibt (dies gilt auch, wenn ein Prozess abstürzt).

+0

es ist schön, diejenigen – onurcano22

+0

@ onurcano22 zu hören: Sie können auch lesen [** diese Antwort **] (http://stackoverflow.com/a/13078157/3740093) über das Thema. –

+0

das ist eine kurze Erklärung über das, was ich wissen muss. Danke vielmals. – onurcano22

1

Ich nehme an, Sie haben einen Timer oder etwas anderes ausgeführt, das regelmäßig Objekte in Ihrer Klasse verwendet, die vom GC beim Schließen entsorgt wurden.

Sie sollten IDisposable in Ihrer Klasse implementieren. Wenn es ein Formular ist, tut es bereits und Sie sollten im Designer nach Dispose(bool)

suchen

Wenn Sie Timer laufen haben, sollten Sie sie dort stoppen und sie null. Tatsächlich sollte jedes verwaltete Objekt in Ihrer Klasse hier angeordnet werden. So können Sie die Reihenfolge steuern, in der Sie Ihre Objekte angeordnet bekommen

Protected Overridable Sub Dispose(disposing As Boolean) 
    If Not Me.disposedValue Then 
     If disposing Then 
      ' TODO: dispose managed state (managed objects). 
      ' i.e. stop all timers 
     End If 

     ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. 
     ' TODO: set large fields to null. 
    End If 
    Me.disposedValue = True 
End Sub 
+0

Wenn er nur dafür sorgt, dass nichts auf seine Variable zugreift, reicht das. Es besteht keine Notwendigkeit, etwas zu entsorgen, wenn Ihre Anwendung geschlossen wird. [** Lies das **] (http://stackoverflow.com/a/13078157/3740093) –

+0

Klärung meines obigen Kommentars: Es ist nicht falsch, "IDisposable" zu implementieren, es kann tatsächlich eine ziemlich gute Sache sein, zu tun. Sie müssen jedoch nicht jedes Objekt und jede Kontrolle im Formular ablegen. - ** Aber ** da das Problem auf eine "ObjectDisposedException" zurückzuführen ist, bedeutet dies, dass die Klasse bereits entsorgt wurde, wenn etwas versucht, darauf zuzugreifen. –

+2

Fair genug. Aber es tut nicht weh, Kontrolle über die Reihenfolge zu haben, in der sie geklärt werden. Das Stoppen von Timern stellt zuerst sicher, dass Timer nicht nach bereits entsorgten Ressourcen suchen. Lassen Sie den GC die Reihenfolge bestimmen, stellt OP diese Frage :) – djv

Verwandte Themen