0

ここで質問しました: The process cannot access the file because it is being used by another process: Correct way to read\write to a file: 頻繁に使用されるアプリケーション - パート II .

「作成に費用がかかる」データを読み取ってキャッシュする、頻繁に使用される.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();
    }
}
4

1 に答える 1