Laden...

Stream wird nicht korrekt geschlossen!

Erstellt von CaptainIglo vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.526 Views
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 16 Jahren
Stream wird nicht korrekt geschlossen!

Hallo,

ich habe hier in meiner App ein Settings-File welches ich mit folgender Methode deserialisiere:

Stream inStream = null;
try
{
    inStream = File.OpenRead(driveLetter + @":\Settings.ipm");
    XmlSerializer serializer = new XmlSerializer(typeof(iPMSettings));
    settings = (iPMSettings)serializer.Deserialize(inStream);
    inStream.Close();
}
catch(Exception exp)
{
    MessageBox.Show("Error loading settings: \n\r\n\r" +
                        exp.Message, "Unhandled Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
    settings = new iPMSettings();
}
finally
{
    if (inStream != null)
        inStream.Close();
}

Wenn ich jetzt mehrmals die Settings einlese (benötige diese in unterschiedlichen forms) kommt plötlich eine Exception, dass das file bereits von einem anderen Process geöffnet ist und nicht zugegrifen werden kann.
Wie kann das sein, wenn ich immer alle Streams zumache?
Kann ich in C# irgendwie den Lock entfernen und dann zugreifen?

mfg

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 16 Jahren

Habe jetzt das Programm ein wenig umgebaut und jetzt wird nur mehr aus einer Funktion heraus auf das File zugegriffen und da habe ich folgendes festestellt:
Wenn ich die Datei nach dem einlesen lösche, kann ich darauf ohne probleme schreiben, wenn ich allerdings nach dem Löchen gleich die Datei wieder speichere kommt beim 2. Speicherversuch wieder die Exception...

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo CaptainIglo,

verwendest du mehrere Threads, bzw. einen BackgroundWorker?

Wie und vor allem wo serialisierst du die Datei?

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 16 Jahren

Ja, ich verwende mehrere Threads, doch auf die Datei wird nur mehr aus einer Funktion heraus zugegriffen und das ist die oben gepostete und die wird beim start einmal aufgerufen.
Serialisiert wird sie genau gleich (nur eben Serialize anstatt Deserialize) beim 1. aufruf der Application bzw. beim ändern von Einstellungen (was aber eben nicht funktioniert).

5.742 Beiträge seit 2007
vor 16 Jahren

Ist sichergestellt, dass nicht mehrere Threads gleichzeitig die Serialisier-, bzw. Deserialisiermethode aufrufen (Monitor, lock, Mutex, etc.)?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo CaptainIglo,

die Methode sieht ok aus. Allerdings bekommst du das Problem ja wohl beim Speichern, die Methode ist aber für das Lesen. Poste doch mal den anderen Code.

herbivore

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 16 Jahren

Bittesehr:

Stream outStream = null;
try
{
    outStream = File.Create(driveLetter + @":\Settings.ipm");
    XmlSerializer serializer = new XmlSerializer(typeof(iPMSettings));
    serializer.Serialize(outStream, settings);
    outStream.Close();
}
catch (System.Exception exp)
{
    MessageBox.Show("Error saving settings: \n\r\n\r" +
                        exp.Message, "Unhandled Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
    if (outStream != null)
        outStream.Close();
}

Ich habe breakpoints in der Funktion und schon beim 1. Aufruf kommt die exception.

5.742 Beiträge seit 2007
vor 16 Jahren

Kannst du durch Logging herausfinden, in welcher Reihenfolge die Datei geöffnet, geschlossen, wieder geöffnet usw. wird und welche Exceptions wann dabei auftreten?

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 16 Jahren

Ja, habe ich bereits:

  1. Datei wird geöffnet, deserielisiert und wieder geschlossen
  2. Application läuft und greift NICHT auf das File zu
  3. Settings werden geändert
  4. Geänderte settings werden geschrieben -> Exception "Kann nicht zugreifen"

Habe das Problem jetzt temporär folgendermaßen "umschifft":
Nach dem einlesen lösche ich das File und erstelle es per Timer nach 1s wieder mit den akt. Settings, dann funktioniert es (momentan)...