该进程无法访问该文件,因为它正被另一个进程使用:正确读取\写入文件的方式:使用频繁的应用程序 - 第二部分

Aji*_*oel 1 .net c# asp.net

我们有一个使用频繁的.Net 3.5应用程序,它读取"创建昂贵的数据"并对其进行缓存.但是,我们在读取缓存文件和写入缓存文件时遇到很多错误.我从StackOverflow论坛获得的一些建议是:

  • 一个.以"FileShare.Read"模式读取文件,并以"FileShare.ReadWrite"模式写入文件.(当系统执行读/写操作时,应该使用"FileAccess"模式.)
  • 湾 在每次读取和写入操作后使用"GC.Collect".(在每次读取/写入操作后执行此操作会产生什么性能影响.)

这是读取和写入文件的正确方法吗?请指教.

private XmlDocument ReadFromFile(string siteID, Type StuffType)
{
   XmlDocument result = null;
   var fsPath = FileSystemPath(siteID, StuffType.Name);
   result = new XmlDocument();
   using (var streamReader = new StreamReader(fsPath))
   //using (var fileStream = new FileStream(fsPath, FileMode.Open, FileAccess.Read, FileShare.Read))
   {
      result.Load(streamReader);
   }
   //GC.Collect();                
   return result;
}

private readonly object thisObject = new object();
private void WriteToFile(string siteID, XmlDocument stuff, string fileName)
{
   var fsPath = FileSystemPath(siteID, fileName);
   lock (thisObject)
   {
      //using (var fileStream = new FileStream(fsPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
      using (var streamWriter = new StreamWriter(fsPath))
      {
         stuff.Save(streamWriter);
      }
      //GC.Collect();
    }
 }
Run Code Online (Sandbox Code Playgroud)

Mar*_*der 7

如果要同步访问资源,则有多个选项,具体取决于上下文.有几个(通用)情况:

  1. 单进程,单线程

    无需同步.

  2. 单进程,多线程

    使用像lock或的简单锁定机制ReaderWriterLockSlim.

  3. 多个流程,单机

    使用(命名)Mutex.互斥体不是很快.更多关于底层的表现.

  4. 多个进程,多台机器

    现在它开始变得有兴趣了..NET没有针对此的现成解决方案.我可以想到两个解决方案:

    • try-again-method:使用try-catch进行while循环.让他在try-scope中进行资源操作.如果成功,则返回成功结果.如果失败,请等待几毫秒再试一次......再次......再次.
    • 同步主服务器:使网络服务在网络中的中心位置运行.首先想要访问资源的所有进程都必须向服务请求权限.如果资源被"锁定",则服务将等待,导致进程等待.一旦资源被释放,服务就会被通知,并允许下一个进程在线访问资源.

在这种情况下
,当然最后的解决方案是通用解决方案.对于Ajit Goel,它就像创建读/写文件的集中服务一样简单.然后你有一个文件管理员控制iets文件.

另一种解决方案是将所有文件存储在中央数据库中,让他进行所有同步.

性能
如果性能开始成为问题,您可以尝试创建缓存.

  1. 你可以在内存中创建一个缓存(但是有很多文件或大文件,这可能会成为内存问题).
  2. 您可以在本地文件夹中创建一个缓存(每个进程一个).只要修改了集中位置(只验证日期),就可以将该文件(带有Mutex锁)复制到您自己的本地文件夹中.从那里开始,您可以反复阅读文件而无需具有读访问和读共享的锁.