Was ist der beste Weg, XmlWriter Zugriff auf eine Datei zu synchronisieren IOExceptions zu verhindern?

StackOverflow https://stackoverflow.com/questions/442235

Frage

Es gibt mehrere Orte in einer Anwendung, die XmlWriter.Create auf der gleichen Datei aufrufen, die alle durch die folgende Funktion aufgerufen. Wenn man ruft, während ein anderer noch zu schreiben, erhalte ich eine IOException. Was ist der beste Weg, um Zugang zu sperren oder zu synchronisieren?

Hier ist die Funktion, die verwendet wird ist:

        public void SaveToDisk()
    {
        try
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            using (XmlWriter writer = XmlWriter.Create(SaveFileAbsolutePath, settings))
            {
                XamlWriter.Save(this, writer);
                writer.Close();
            }

        }
        catch (Exception ex)
        {
            // Log the error
            System.Diagnostics.Debug.WriteLine(ex.Message);

            // Rethrow so we know about the error
            throw;
        }
    }

UPDATE: Es sieht aus wie das Problem von Aufrufen dieser Funktion nicht nur ist, sondern weil ein anderer Thread auf die Datei zu lesen, während diese Funktion ist das Schreiben ist. Was ist der beste Weg, dies zu sperren wir nicht versuchen, in die Datei zu schreiben, während es gelesen wird?

War es hilfreich?

Lösung

eine Sperre kann Ihr Concurrency Problem lösen und damit die IOException zu vermeiden, aber Sie dürfen nicht vergessen, das gleiche Objekt entweder auf SaveToDisk und ReadFromDisk (Ich gehe davon aus das die Lesefunktion ist), ansonsten völlig nutzlos es ist nur zu sperren, wenn Sie lesen.

private static readonly object syncLock = new object();

public void SaveToDisk()
{
     lock(syncLock)
     {
          ... write code ...
     }
}

public void ReadFromDisk()
{
     lock(syncLock)
     {
          ... read code ...
     }
}

Andere Tipps

Eine statische Verriegelung sollte die Arbeit schnell tun und einfach:

private static readonly object syncLock = new object();

dann ...

public void SaveToDisk()
{
    lock(syncLock)
    {
        ...your code...
    }
}

Sie können auch [MethodImpl(MethodImplOptions.Synchronized)] verwenden (auf statisch Methode, die die Instanz als Argument akzeptiert - zum Beispiel, eine Erweiterungsmethode), aber eine explizite Sperre ist vielseitiger

.

Ich würde tatsächlich eine ReaderWriterLock maximieren Gleichzeitigkeit. Sie können zu einem Zeitpunkt mehr Leser aber nur ein Schriftsteller ermöglichen.

private ReaderWriterLock myLock = new ReaderWriterLock();

public void SaveToDisk()
{
     myLock.AcquireWriterLock();
     try
     {
          ... write code ...
     } 
     finally
     {
          myLock.ReleaseWriterLock();
     }
}

public void ReadFromDisk()
{
     myLock.AcquireReaderLock();
     try
     {
          ... read code ...
     } 
     finally
     {
          myLock.ReleaseReaderLock();
     }
}

So stellen Sie sicher, dass die Datei öffnen mit FileShare.Read , so dass nachfolgend liest nicht versagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top