c#: ObjectDisposedException in SuspendLayout - wie den Übeltäter finden?

OP #3162943
Lesenswert?

Ich amüsiere mich jetzt schon den zweiten Tag mit dem Problem und komme 
auf keinen grünen Zweig:

- Ich entsorge ein selbstgestricktes, kleines Control - das geht
  beliebig oft gut:
1
   editPanel.Controls.Remove(a.Control);
2
   a.Control.Dispose();
3
   a.Control = null;
  a.Control.Dispose setzt eine Referenz auf a im Control auf null:
1
    protected override void Dispose(bool disposing) {
2
       _aspect = null;               // Zeigt auf a
3
       <es folgt der übliche, generierte Dispose-Code>
4
    }
- Dann verlasse ich den von Form abgeleiteten Dialog und entsorge
  ihn mit Dispose aus dem Hauptdialog heraus.
- Dann erzeuge ich den Dialog neu und wiederhole die Übung
  Nach dem ersten Control-Löschen bekomme ich ein
1
   ObjectDisposedException in SuspendLayout
  bevor der Fensterinhalt neu angezeigt werden soll, direkt nach
  der Löschoperation.
  Wenn ich die Löschoperation(en) nicht mache, tritt der Fehler in
  der Anzeigeroutine nicht auf.

Bei beiden Dialogen, die im Programm vorkommen und in meinem Control in 
die Dispose-Routinen sind Trace-Ausgaben eingebaut. Ebenso in den 
Konstruktor des Controls - die Ausgaben zeigen keine Auffälligkeiten. 
(Der Haupdialog läuft dabei durch, der zweite wird vom ersten geöffnet.)

Wie kann man herausfinden, welches Objekt der Übeltäter ist, wenn man 
keine Quellen von dem .net-Zeugs hat?

---------

Nachtrag:
Die Komponente ObjectName im Exception-Objekt ist "".
Der Stack-Eintrag zum Absturz lautet:
1
System.Drawing.dll!Microsoft.AGL.Common.MISC.HandleAr(
2
  Microsoft.AGL.Common.PAL_ERROR ar = InvalidHandle) + 0x5c bytes
OP #3163103
Lesenswert?

Des Rätsels Lösung:

Ich hatte einen static delegate in der Control-Klasse beim ersten Aufruf 
des zweiten Dialogs initialisiert und dann nicht mehr. Der Delegate 
zeigte auf eine Methode im zweiten Dialog.

Dann wurde der Dialog mit Dispose entsort, aber der Delegate blieb 
unverändert.

Das ist fatal, weil im Delegate neben der Methode auch der this-Zeiger 
auf das Objekt steckt, zu dem die Methode gehört - in dem Fall also die 
erste Instanz des zweiten Dialogs.

Mit der zweiten Instanz dieses Dialogs nahm das Verhängnis seinen Lauf: 
der Delegate-Aufruf arbeitete auf der (entsorgten) ersten Instanz des 
Dialoges...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren