[C#] Programm schließt garnicht

07/27/2013 13:00 _Roman_#1
Hi,

ich bin grad an einem kleinen Programm dran und seit dem Serialisieren der Einstellungen, lässt sich das Programm garnicht mehr schließen. Ob ich auf den Button Close drücke oder über das X, geht einfach nicht. Die einzige Möglichkeit ist es, den Prozess zu beenden. Das komische ist ja, dass keine Fehlermeldung kommt oder irgendeine Exception oder so. Hier wären mal die wichtigsten Codeabschnitte dafür:

Code:
        private void MainWindow_Load(object sender, EventArgs e)
        {
            if (System.IO.File.Exists("C:\\temp\\MM_data"))
            {
                MM_Methods.Access = object_Serialize.DeserializeMovies();
                lb_movies.Items.Add(MM_Methods.Access.lb_movies);
            }
        }
Code:
        private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
        {
            object_Serialize.SerializeMovies(MM_Methods.Access, "C:\\temp\\MM_data");
        }
Code:
        private void button_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }
Code:
    public class Serializer
    {
        //Serialize
        public void SerializeMovies(Object objekt, string path)
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            FileStream fStream = new FileStream(path, FileMode.Create, FileAccess.Write);
            binFormatter.Serialize(fStream, objekt);
            fStream.Close();
        }
        //

        //Deserialize
        public MM_SerializedData DeserializeMovies()
        {
            BinaryFormatter binFormatter = new BinaryFormatter();
            FileStream fStream = new FileStream("C:\\temp\\mm_data", FileMode.Open, FileAccess.Read);
            MM_SerializedData object_deserialize = (MM_SerializedData)binFormatter.Deserialize(fStream);
            fStream.Close();

            return object_deserialize;
        }
        //
    }
Die Klasse, die serialisiert werden soll, ist auch mit [Serializable()] markiert.
Vor allem habe ich noch ein anderes Programm, wo das ganze klappt.

Mit freundlichen Grüßen
07/27/2013 15:10 Easy-Emu#2
Der Grund für sowas ist meist nur eine Methode, die den Hauptthread blockiert.

bist du dir Sicher, dass von den Streams keiner in einen Loop landet oder immernoch was liest/schreibt?

Mal bissle debuggen
07/27/2013 15:18 _Roman_#3
Gucke ich gleich nochmal nach, wobei die Serialisierung + Deserialisierung kopiert ist von meinem anderen Programm. Debug kommt auch nichts leider
07/27/2013 15:19 Schlüsselbein#4
Abgesehen davon using, keine hardgecodeten Pfafe und die .NET Naming Convention verwenden.
Quote:
Debug kommt auch nichts leider
Etwas genauer?
07/27/2013 15:26 _Roman_#5
Was meinst du mit using. Soll ich die das using Zeug zeigen? Ich debugge immer und eine Error oder ähnliches kommt nicht

using vom Backend
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Win32;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
und vom Frontend
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using MM_Back;
07/27/2013 15:27 Easy-Emu#6
Zum Debuggen gehört auch Testing, sorich bestimmt Method Kommentieren, damit diese nicht aufgerufen werden und schauen ob das Ganze evtl. dadurch blockiert wird.
07/27/2013 15:29 Schlüsselbein#7
Debuggen: Durch den Code steppen und schauen, wo es hängt. Ggf den Stack im Auge behalten.
Quote:
Was meinst du mit using. Soll ich die das using Zeug zeigen? Ich debugge immer und eine Error oder ähnliches kommt nicht
[Only registered and activated users can see links. Click Here To Register...]

Mal ganz allgemein: Besteht Interesse an einem Tutorial übers Debugging? (hab so den Eindruck, als würden viele User hier den Debugger unterschätzen)
07/27/2013 15:37 _Roman_#8
Ich hätte Interesse an so einem Tutorial.
Das mit der using Anweisung verstehe ich nicht so recht, also den Nutzen

Edit: Habe grade den Methodenaufruf bei MainWindow_FormClosing auskommentiert und es hat geklappt. Jetzt muss ich nurnoch rausfinden warum das so ist :D
07/27/2013 15:44 Easy-Emu#9
Dann gehst du einfach weiter in die Methode wo das ganze passiert und kommentierst da weiter
07/27/2013 16:36 _Roman_#10
Hab jetzt per Haltepunkt rausgefunden, dass der einfach aus der Funktion rausspringt, nachdem die fstream Datei erstellt wurde, also hier:

Code:
FileStream fStream = new FileStream(path, FileMode.Create, FileAccess.Write);
Dann versucht der zu closen, aber die Datei ist ja noch offen. Verstehe nur nicht warum
07/27/2013 16:53 Schlüsselbein#11
Auskommentieren musst du normal nichts. Beim Debuggen reicht es meistens, einfach durchzusteppen und dabei halt so tief zu gehen, bis der Fehler auftritt.

Quote:
Dann versucht der zu closen, aber die Datei ist ja noch offen. Verstehe nur nicht warum
Check das msdn für das Verhalten beim Erstellen des Objekts und die Parameter auf gülitgkeit.
Ausserdem sollte man u.a. genau wegen sowas using verwenden.

.NET war etwas länger her, aber so in der Arts funktionierte es:
Code:
using(var fstream = new FileStream(...))
{
    // mache irgendwas mit fstream
}
Dabei gibt das Objekt automatisch die Ressource frei, wenn es regulär out of scope geht oder eine Excpetion auftritt. Wenn du etwas C++ bewandert bist, denke einfach mal an RAII.
07/27/2013 16:55 _Roman_#12
Und was hat dann das using für nen Sinn?

Edit: Leider geht das auch nicht mit dem using. Die Parameter sind richtig vom Filestream.
07/27/2013 21:54 kissein#13
Man muss nichtmehr manuell disposen. Am Ende der using Scope übernimmt der GC das für einen, sofern von IDisposable abgeleitet wird.
07/27/2013 22:43 _Roman_#14
Ah verstehe, aber das löst leider nicht mein Problem :( Ich probiere morgen mal paar andere Positionen aus, wo ich serialisieren könnte
07/27/2013 23:26 Schlüsselbein#15
Quote:
Man muss nichtmehr manuell disposen. Am Ende der using Scope übernimmt der GC das für einen, sofern von IDisposable abgeleitet wird.
Das ist falsch. IDisposable ist ein Interface, welches die Methode Dispose bereitsteillt. Falls der GC irgendwas aufruft, dann sowieso zu einem unbestimmten Zeitpunkt.

Siehe: [Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Also: Sich das Leben einfacher machen und using verwenden.

@TS: Hast du die Berechtigungen für die Datei? Bei welcher Methode schmiert dir dein Programm jetzt genau ab? Irgendwas musst du ja sehen können.