在多个应用程序域中使用时,读取\写入文件的最佳方法

时间:2012-04-06 04:26:50

标签: c# file-io locking

我正在使用XML文件来存储值。可以从多种方法访问此XML文件。

Private object lockObject = new object() 
Method1
 {
    Lock(this.lockObject)  
  {
      MyCommonMethod()  
  }
 } 
Timer.ElapseEvent 
{  
  Lock(this.lockObject)  
  {    
  MyCommonMethod()  
  } 
} 


   MyCommonMethod()
     {  
 // Read/Write to XML file.  
 var element = XElement.Load(path);  
 // some operations  

   element.save(path) 
} 

现在,这个类已被多个项目(服务)使用,而这些项目又被合并到一个项目中。

我可以在一个类中使用STATIC锁定对象吗?它会在这种不同进程的情况下工作吗?

因此有可能他们同时使用该文件,有时它会给我一个错误,即不同的线程拥有该文件,尽管我保留了LOCK。

这个赛场上最好的解决方案是什么? 请指导。


这个链接怎么样......

Is there a way to check if a file is in use?

这是最好的方法,或者我应该选择Mutex?

请指导..

2 个答案:

答案 0 :(得分:3)

看起来它不是“不同的应用程序域”问题,而是“不同的进程”问题。无论如何,您可以应用严格的同步解决方案,如mutex

mutex.WaitOne();
MyCommonMethod();
mutex.ReleaseMutex();

此外,如果您使用的是C#4.0,则可以使用Memory-Mapped I/O来实现此目的。

答案 1 :(得分:2)

不同进程之间不会共享静态变量。

你可以:

  1. 锁定文件本身(将FileShare.None传递给FileStream constructor,然后使用该流读取XML)或
  2. 使用全局互斥锁(将非空名称传递给Mutex constructor)。
  3. 如果文件已被锁定(它只是立即抛出异常),则选项(1)不会阻止 - 如果要模拟阻塞行为,则必须重复"poll"该文件。另一方面,只要您的应用程序是唯一访问该文件的应用程序,选项(2)将起作用。选择你的毒药。