Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 28.09.10 17:06 
Wieso kann ich nach dem Aufruf von form.Dispose(); immer noch auf den Wert zugreifen, der in der Textbox steht und wie kann ich das unterbinden?

MfG Bunny
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 28.09.10 18:37 
Eine managed Klasse hält eine managed Ressource, warum sollte Dispose etwas daran ändern? Und was stört dich daran?

_________________
>λ=
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 28.09.10 23:02 
Naja mein Programm öffnet und schließt ständig Winforms und ich hatte gehofft, dass durch Disponse die Winform keine Resourcen mehr verbraucht. Wenn ich aber danach noch immer auf die Textbox zugreifen kann, ist die Winform ja doch noch irgendwie da, oder etwa nicht?
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Di 28.09.10 23:10 
in diesem Fall solltest du den GarbageCollector anregen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        [DllImport("kernel32.dll")]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);

        /// <summary>
        /// Flushes the memory
        /// </summary>
        public static void FlushMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
        }
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Mi 29.09.10 10:12 
Die Managed-Resourcen werden automatisch freigegeben, sobald du keine Referenz mehr auf das Objekt hast.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
myForm = new TestForm();
myForm.Show();


//--> wenn du  nun die Variable myForm auf eine andere Referenz setzt:
myForm = new TestOtherForm();

//--> oder wenn du die Variable = null setzt
myForm = null

oder wenn deine Variable im Scope ihre Sichtbarkeit verliert, dann werden die Resourcen freigegeben. (Zwar nicht unmittelbar, sondern einfach dann wenn der GBC seine Runde dreht)

Mit anderen Worten, es sollte nicht nötig sein, selber noch etwas zu tun.


Um das mit dem Scope nochmals hervorzuheben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void ShowForms() {

            var from1 = new From();
            var from2 = new From();

            from1.ShowDialog();
            from2.ShowDialog();
        }

Nachdem die Methode ShowForms ihre Arbeit beendet hat, und der Scope nicht mehr auf dieser Methode liegt, verlieren alle lokalen Variabeln dieser Methode ihre Sichtbarkeit, und werden entsorgt.
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.09.10 12:34 
Achso?

Also ist es demnach sinnlos, dass ich nach ShowDialog noch Disponse aufrufe wie in diesem Beispiel?

ausblenden C#-Quelltext
1:
2:
if (form.ShowDialog() == DialogResult.Cancel)
                form.Dispose();
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 29.09.10 18:32 
user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Also ist es demnach sinnlos, dass ich nach ShowDialog noch Disponse aufrufe wie in diesem Beispiel?
Nein! Alles, was IDisposable implementiert, solltest du nach Benutzung auch disposen. Siehe msdn.microsoft.com/e...posable.dispose.aspx und sicher noch einige andere interessante Artikel über Google.

user profile iconIsNull hat folgendes geschrieben Zum zitierten Posting springen:
Nachdem die Methode ShowForms ihre Arbeit beendet hat, und der Scope nicht mehr auf dieser Methode liegt, verlieren alle lokalen Variabeln dieser Methode ihre Sichtbarkeit, und werden entsorgt.
Genau genommen könnten die Instanzen schon entsorgt werden, noch während ShowDialog auf ihnen aufgerufen wird.

_________________
>λ=
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 29.09.10 22:17 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Genau genommen könnten die Instanzen schon entsorgt werden, noch während ShowDialog auf ihnen aufgerufen wird.

Hö? Man kann doch nicht einfach ein Objekt entsorgen, wenn eine seiner Methoden (ShowDialog) noch auf dem Call-Stack steht!? Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 29.09.10 23:00 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.
Das stimmt, aber zwischen diesem Feldzugriff und dem Ende der Methode ist ja - immer noch rein theoretisch - trotzdem noch eine Anweisung Platz für eine Garbage Collection ;) . Und damit lautet die Antwort auf
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Hö? Man kann doch nicht einfach ein Objekt entsorgen, wenn eine seiner Methoden (ShowDialog) noch auf dem Call-Stack steht!?
Doch.

_________________
>λ=

Für diesen Beitrag haben gedankt: Yogu
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 29.09.10 23:11 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Vor allem, weil ShowDialog als letzte Anweisung sicherlich auf ein Feld zugreift, in dem der DialogResult gespeichert ist.
Das stimmt, aber zwischen diesem Feldzugriff und dem Ende der Methode ist ja - immer noch rein theoretisch - trotzdem noch eine Anweisung Platz für eine Garbage Collection ;)


The Old New Thing hat folgendes geschrieben:
A weird real-world analogy: The garbage collector can collect your diving board as soon as the diver touches it for the last time—even if the diver is still in the air!


Ist ja verrückt, man lernt nie aus... Danke für die Fortbildung! :D