2013-07-23 58 views
0

我在這裏問了一個問題:The process cannot access the file because it is being used by another process: Correct way to read\write to a file: heavily used application-Part II讀寫入文件:重度使用的應用程序

我們有一個使用頻率很高的.Net 3.5應用程序,它讀取「創建」數據並對其進行高速緩存。但是,我們在讀取緩存文件和寫入緩存文件時都會遇到很多錯誤。我有一個進程,多個線程,我希望應用程序同步對資源的訪問。我被建議使用一個簡單的鎖定機制,如鎖或ReaderWriterLockSlim(請參閱:http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx)。然而,這似乎使這個問題在生產中變得更糟。

編輯 變更實施後,很多緩存文件最後都有一個「>」標記。由於這個文件不再是xml文件。

有人可以看看代碼,並建議我可能做錯了什麼?變更前

代碼:變化後

private XmlDocument ReadFromFile() 
{ 
    XmlDocument result=null; 
    string fileSystemPath=FileSystemPath(); 
    try 
    { 
     result=new XmlDocument(); 
     using (StreamReader streamReader = new StreamReader(fileSystemPath)) 
     { 
      result.Load(streamReader); 
     } 
    } 
    catch (FileNotFoundException) 
    { 
     result=null; 
    } 
    return result; 
} 

private object thisObject= new object(); 
private void WriteToFile(string siteID, XmlDocument stuff) 
{ 
    string fileSystemPath=FileSystemPath(); 
    lock(thisObject) 
    { 
     using (StreamWriter streamWriter = new StreamWriter(fileSystemPath)) 
     { 
      stuff.Save(streamWriter); 
     } 
    } 
} 

代碼:

private readonly ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim(); 
private XmlDocument ReadFromFile() 
{ 
    XmlDocument result = null; 
    var fileSystemPath = FileSystemPath();   
    readerWriterLockSlim.EnterReadLock(); 
    try 
    { 
     result = new XmlDocument(); 
     using (var fileStream = new FileStream(fileSystemPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     using (var streamReader = new StreamReader(fileStream)) 
     { 
      result.Load(streamReader); 
     } 
    } 
    catch (FileNotFoundException) 
    { 
     result = null; 
    } 
    finally 
    { 
     readerWriterLockSlim.ExitReadLock(); 
    } 
    return result; 
} 


private void WriteToFile() 
{ 
    var fileSystemPath = FileSystemPath();    
    readerWriterLockSlim.EnterWriteLock(); 
    try 
    { 
     using (var fileStream = new FileStream(fileSystemPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) 
     using (var streamWriter = new StreamWriter(fileStream)) 
     { 
      stuff.Save(streamWriter); 
     } 
    } 
    finally 
    { 
     readerWriterLockSlim.ExitWriteLock(); 
    } 
} 
+0

地塊不告訴我們什麼是錯誤。請具體說明。 – Ehsan

+0

我編輯了上面的問題,編輯部分 –

+0

您提到的編輯與鎖定機制無關。這意味着你正在加載的緩存是無效的。 – Ehsan

回答

0

此代碼一些變化不大應該工作的錯誤

private readonly ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim(); 
private XmlDocument ReadFromFile() 
{ 
    XmlDocument result = null; 
    var fileSystemPath = FileSystemPath();   
    readerWriterLockSlim.EnterReadLock(); 
    try 
    { 
     result = new XmlDocument(); 
     using (var streamReader = new StreamReader(fileStream)) 
     { 
      result.Load(streamReader); 
     } 
    } 
    catch (FileNotFoundException) 
    { 
     result = null; 
    } 
    finally 
    { 
     readerWriterLockSlim.ExitReadLock(); 
    } 
    return result; 
} 


private void WriteToFile(XmlDocument stuff) 
{ 
    var fileSystemPath = FileSystemPath();    
    readerWriterLockSlim.EnterWriteLock(); 
    try 
    { 
     using (var streamWriter = new StreamWriter(fileSystemPath)) 
     { 
      stuff.Save(streamWriter); 
     } 
    } 
    finally 
    { 
     readerWriterLockSlim.ExitWriteLock(); 
    } 
} 
+0

而且您必須確信,在WriteToFile方法中,XmlDocument不會從另一個線程更改 –

+0

這也假定只有單個文件的訪問受到控制。或者在文件A被寫入時阻止讀取文件B,C,D,E和F是可以的。 –

+0

@RossPresser,當前代碼在寫入時會阻止所有文件的讀寫操作,它保證了所有文件的完整性。如果您想要更高效的代碼,則必須使用每個文件讀寫器鎖定。 –

相關問題