Sicherster Weg Programm zu beenden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sicherster Weg Programm zu beenden

    Hallihallo,

    Ich suche nach dem besten Weg mein Programm zu beenden. Da gibt es schon tausend Themen aber ich will nur noch mal sicher gehen, die für meinen Fall sicherste Methode zu verwenden:

    Mein Programm hat mehrere Forms, und greift auf mehrere DLLs (auch welche, die nicht über "Verweise" eingebunden sind) , zur Laufzeit geöffnete Dateien und Ressourcen und verschiedene Audioausgabegeräte zu. Auch soll die Sub Finalize() durchlaufen werden.

    Was ist eurer Meinung nach die beste Methode alles sicher zu beenden und zu disposen?
    @kafffee Beende das Programm über das Kreuz oben rechts im Hauptprogramm oder mach Dir einen Close-Button im Hauptfenster, der .Close() aufruft.
    Fede Form, jedes UserControl hat eine Dispose()-Methode (in der Datei x.Designer.vb), dort testest Du alle IDisposable-Instanzen, und wenn eine nicht Nothing ist, wird davon .Dispose() aufgerufen und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Eine Anwendung hat üblicherweise ein Main-Form. Wenn das geschlossen wird beendet die Anwendung sauber.
    So kann man es zumindest in den Projekteinstellungen einstellen, und das ist auch die Voreinstellung.

    Wenn du iwas anneres konfiguriert hast, musst du dein Proggi dementsprechend anders zur Beendigung komplimentieren - weiss ich ja nicht.
    @kafffee
    • Gehe Zeile für Zeile durch dein Programm und schau, ob Visual Studio dir die Verwendung von Using vorschlägt.
    • ein Bitmap sollte als Shared deklariert sein, damit man sich sicher sein kann, dass das Bild verworfen wird

    VB.NET-Quellcode

    1. Public Shared Property Bild_zum_mit_arbeiten1 As Bitmap
    • MS-Office-Produkte müssen mit ReleaseCOMObject verworfen werden.
    Ansonsten haben die anderen schon alles gesagt. Visual Basic räumt von alleine auf. Spätestens beim Beenden des Programms.
    Wenn dir irgendetwas komisch vorkommt, was deine RAM-Auslastung angeht, die VS ja anzeigt, dann mache einen konkreten Thread auf. Habe ich auch schon gemacht.
    Stell dir vor, du machst ein zweites Fenster. Bei jedem Schließen bleiben Überreste dieses Forms im Speicher. Da kannst du nix tun.
    Genau wie ein OpenFileDialog, wenn einmal geöffnet, zum Teil im Speicher bleibt, nachdem du ihn schließt. Hier ein Zitat von Stackoverflow:
    Do be aware that garbage collection in .NET means that you usually won't get memory back immediately when you're done with it.

    Bartosz schrieb:

    ein Bitmap sollte als Shared deklariert sein, damit man sich sicher sein kann, dass das Bild verworfen wird
    Bitte was? Diese Aussage ist totaler Quatsch.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das wurde mir hier so beigebracht. Ich habe einst einen Thread aufgemacht, in dem der FxCop-Analyzer moserte, dass "eventuelle das Bitmap nicht verworfen wird". Ihr habt mir geraten, es als Shared zu deklarieren. Seitdem quakt er nicht mehr rum. So. Er meldete, weil er sich nicht sicher sein konnte, dass in jeder Instanz der Klasse das Bitmap verworfen wird. Deswegen soll man es mittels Shared zu einem globalem Bitmap machen. (Natürlich weiß ich auch, dass kein Mensch von Form1 noch eine weitere Instanz erzeugt als die, die es schon gibt, aber es ist de facto besser, Shared zu schreiben).

    ok, ich hätte mich genauer ausdrücken können...
    Aha... Das diente seinerzeit wohl eher dazu FxCop-Analyzer zu besänftigen als um ein tatsächliches Problem zu lösen. Zumindest ist das an dieser Stelle in diesem Thread fehl am Platz.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Bartosz schrieb:

    ein Bitmap sollte als Shared deklariert sein, damit man sich sicher sein kann, dass das Bild verworfen wird
    Bitte was? Diese Aussage ist totaler Quatsch.
    Ja und Nein. Oder auch nicht.
    Also ich hoffe nicht, dassich gesagt hab, dass man sich bei einer Shared Bitmap sicher sein könne, dass sie verworfen werde.
    Sondern der Sinn, eine Bitmap Shared zu designen ist, dass sie nur einmal erzeugt wird und ihre Resourcen nur einmal belegt (ohne dass sie verworfen würden).
    Nur einmal - das ist nämlich geringfügig, und zu verschmerzen - insbesondere wenn sie öfters und an mehreren Stellen verwendet wird. Die Eine.

    Ansonsten gehts hier in diesem Thread glaub darum, wie man ein Programm sauber schliesst, und das hat mit Bitmapsen - ob sie nun verworfen werden oder nicht - garnix zu tun.
    Weil wenn ein Programm schliesst - ob sauber oder nicht - werden die Resourcen, die es belegte, freigegeben - ja, auch die Shared Bitmap.
    Sondern der Sinn, eine Bitmap Shared zu designen ist, dass sie nur einmal erzeugt wird und ihre Resourcen nur einmal belegt (ohne dass sie verworfen würden).
    Genau so meinte ich das. :) Und seitdem meldet der FxCopAnalyzer nix mehr (Fakt) und zwar "weil er sich jetzt sicher sein kann, dass alles verworfen wird". So hatte ich das gelernt.

    Ansonsten gehts hier in diesem Thread glaub darum, wie man ein Programm sauber schliesst, und das hat mit Bitmapsen - ob sie nun verworfen werden oder nicht - garnix zu tun.
    So oder so ähnlich habe ich das aufgegriffen. Es geht auch um Disposings.

    kafffee schrieb:

    wie rufe ich die Form1.Close() auf?
    So was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(...)
    2. Me.Close()
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!