读取/写入文件:大量使用的应用程序

本文关键字:应用程序 文件 读取 | 更新日期: 2023-09-27 18:24:15

我在这里问了一个问题:进程无法访问该文件,因为它正被另一个进程使用:读取/写入文件的正确方法:大量使用的应用程序第二部分。

我们有一个使用频繁的.Net 3.5应用程序,它读取"创建成本高昂"的数据并将其缓存。然而,在读取缓存文件和写入缓存文件时,我们都会遇到很多错误。我有一个进程,多个线程,我希望应用程序同步访问资源。有人建议我使用简单的锁定机制,如lock或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();
    }
}

读取/写入文件:大量使用的应用程序

此代码经过一些小的更改后应该可以使用

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