「作成に費用がかかる」データを読み取ってキャッシュする、頻繁に使用される.Net 3.5アプリケーションがあります。ただし、キャッシュ ファイルの読み取りとキャッシュ ファイルへの書き込みの両方で多くのエラーが発生しています。単一のプロセスと複数のスレッドがあり、アプリケーションがリソースへのアクセスを同期するようにしたいと考えています。lock や ReaderWriterLockSlim などの単純なロック メカニズムを使用するようにアドバイスされました ( http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspxを参照)。ただし、これにより、本番環境で問題がさらに悪化したようです。
EDIT 変更が実装された後、多くのキャッシュ ファイルの末尾に ">" タグが付きます。このため、ファイルはもはや 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();
}
}