我在這裏問了一個問題: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();
}
}
地塊不告訴我們什麼是錯誤。請具體說明。 – Ehsan
我編輯了上面的問題,編輯部分 –
您提到的編輯與鎖定機制無關。這意味着你正在加載的緩存是無效的。 – Ehsan