Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

Gelöst von Whiz-zarD

Zur Lösung
  • Lösung

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.
 

  • Autor

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

  • Autor

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

  • Autor
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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.