2009-01-14 71 views
4

應用程序中有多個地方在同一個文件上調用XmlWriter.Create,它們都通過以下函數訪問。當另一個人正在寫程序時調用,我得到一個IOException。什麼是鎖定或同步訪問的最佳方式?什麼是同步XmlWriter訪問文件以防止IOExceptions的最佳方式?

這裏是一個的正在使用的功能:

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

更新:它看起來像這個問題不只是從調用該函數,而是因爲另一個線程讀取該文件,而這個功能是寫爲。什麼是最好的鎖定方式,所以我們不會在讀取文件時寫入文件?

回答

4

使用鎖可以解決您的併發問題,從而避免IOException,但是您必須記得在SaveToDisk和ReadFromDisk上使用同一個對象(我假設這是讀取函數),否則它完全沒用你讀。

private static readonly object syncLock = new object(); 

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

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

靜態鎖應該快速而簡單地做的工作:

private static readonly object syncLock = new object(); 

然後...

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

您也可以使用[MethodImpl(MethodImplOptions.Synchronized)](上接受實例作爲靜態方法一個參數 - 例如,一個擴展方法),但顯式鎖定功能更多。

1

我實際上使用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打開文件,以便後續讀取不會失敗。

相關問題