XMLWriter 액세스를 파일에 동기화하여 IOExceptions를 방지하는 가장 좋은 방법은 무엇입니까?

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

문제

응용 프로그램에는 xmlwriter.create를 호출하는 여러 장소가 있습니다. 동일한 파일에서 모두 다음 함수를 통해 액세스 할 수 있습니다. 다른 사람이 여전히 글을 쓰는 동안 전화를 걸면 ioexception을 얻습니다. 액세스를 잠그거나 동기화하는 가장 좋은 방법은 무엇입니까?

사용되는 기능은 다음과 같습니다.

        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;
        }
    }

업데이트 : 문제는이 기능으로의 통화만으로도 문제가 아니라 다른 스레드가 파일을 읽는 동안이 함수가 IS에 쓰는 것처럼 보입니다. 파일을 읽는 동안 파일에 쓰려고하지 않도록 잠금 방법은 무엇입니까?

도움이 되었습니까?

해결책

잠금 장치를 사용하면 동시성 문제를 해결하여 ioexception을 피할 수 있지만 Savetodisk와 ReadfromDisk에서 동일한 객체를 사용해야합니다 (이것은 읽기 기능이라고 가정합니다).

private static readonly object syncLock = new object();

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

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

다른 팁

정적 잠금은 작업을 빠르고 간단하게 수행해야합니다.

private static readonly object syncLock = new object();

그 다음에...

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

당신은 또한 사용할 수 있습니다 [MethodImpl(MethodImplOptions.Synchronized)] (a 공전 인스턴스를 인수로 받아들이는 메소드 (예 : 확장 방법)이지만 명시 적 잠금은 다재다능합니다.

나는 실제로 a를 사용합니다 ReaderWriterLock 동시성을 극대화합니다. 한 번에 여러 독자가 있지만 한 번에 한 명의 작가 만 허용 할 수 있습니다.

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();
     }
}

파일을 열어야합니다 fileshare.read 따라서 후속 읽기가 실패하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top