Jump to content
  • 0
Melde dich an, um diesem Inhalt zu folgen  

C# ObjectDisposedException

Frage

Im Anhang and das Problem:

funktioniert mein Programm und lässt sich kompilieren, aber der GC macht mir Striche durch die Rechnung (ich benutze kein Dospose und auch kein Multithreading).

Wie gehabt (ich wiederhole es kurz) habe ich 2 Klassen (Forms), wobei Form1 eine Menüleiste hat die Form2 (genannt Settings) aufruft. Das funktioniert einmal - aber sobald jemand Settings schließt und erneut aufruft wird die Exception an diesem Punkt geworfen:

public partial class Form1 : Form
    {
        Settings form2 = new Settings();

        public Form1()
        {            
            InitializeComponent();
            
            try
            {
                ReadIniFile();
                
                //create Event for Settings-Close
                form2.FormClosed += Form2_FormClosed;
            }
            catch
            {
                MessageBox.Show("Initialisierung der ini-Datei fehlgeschlagen");
            }
        }

private void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
        {            
            form2.iniText = iniText;
            form2.Show();          //hier Exception  
        }

Weiß jemand wie ich das verhindern kann und trotzdem sicher sein kann das beim Beenden des kompletten Programs auch wirklich nichts mehr den RAM belegt?

Ich weiß das eine Lösung wäre jedesmal eine neue Instanz zu erstellen, aber dann sind die labels (meine ich zumindest) leer die ich zu Beginn des Programs an Settings übergebe und auch mein Form-Closed Event würde nicht mehr funktionieren. Ideen wie ich dem Programm sagen kann das Form2 nicht weg geworfen werden soll wenn ich es schließe?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

9 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Das ist dann mein Fehler in dem anderen Thread.
Bei der Methode Show() wird die Form aus dem Speicher gelöscht, wenn sie geschlossen wird. Die richtige Methode wäre ShowDialog(). Hier wird die Form dann nur unsichtbar geschaltet, wenn sie geschlossen wird und besitzt dann ein DialogResult.
 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 1

Nein, mit dem GC hat das nichts zu tun. Du wirst tatsächlich an einer Stelle eines der Kompilierergebnisse geöffnet haben (vllt. ein Virenscanner?). Es gibt Tools, mit denen man sich anzeigen lassen kann, welcher Prozess gerade auf eine Datei zugreift.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich muss es dann aber manuell aus dem Speicher schmeißen wenn ich das Programm schließe richtig? Soetwas:

private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
        {
            form2.Dispose();
        }

 

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Gibt es eine Möglichkeit herauszufinden warum ich jedes mal wenn ich das Programm kompilieren möchte die Meldung bekomme das der Prozess nicht abgeschlossen werden kann weil der Prozess nicht auf eine Datei zugreifen kann weil ein anderer Prozess darauf zugreift? Nachdem die Meldung einmal weg geklickt wurde kompiliert das Programm einmal und beim nächsten mal kommt wieder die Meldung.

Hat das nicht auch mit dem GC zu tun? Müsste wenn ich das im Taskmanager richtig sehe ein

"Programmname.vshost.exe *32"

sein das da hängen bleibt.

Edit: Die Datei (der Prozess) ist es nicht, die Datei ist auch da wenn ich nur VS starte, muss also was anderes sein

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 44 Minuten schrieb Panawr:

Hast du denn vielleicht einfach die Datei die ganze Zeit offen? :D 

Das wäre jetzt natürlich die Schönste (und dämlichste), am einfachsten zu behebende Variante, aber nein hatte ich nicht^^

Ich hab den ganzen PC mal neu gestartet und jetzt scheint es zu funktionieren :)

Edit: Oder auch nicht, jetzt müsste ich wissen welche Datei gemeint ist in der Fehlermeldung weil das steht nirgendwo.

bearbeitet von Tician

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Bei Beenden des Programms solltest du Application.Exit() aufrufen. Dann bleibt auch nichts "im Speicher hängen". Das Ergebnis, dass die Settings-Form liefert, sollte mit einem DialogResult abgehandelt werden. Ebenso sollte in Settings, wenn die Form abgehandelt ist, this.Close(); aufgerufen werden.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2019 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung