2

我正在使用 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。

在这个场景中最好的解决方案是什么?请指导。


这个链接怎么样...

有没有办法检查文件是否正在使用?

这是最好的选择还是我应该选择 Mutex?

请指导..

4

2 回答 2

3

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

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

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

于 2012-04-06T05:55:34.970 回答
2

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

您可以:

  1. 锁定文件本身(将FileShare.None传递给FileStream 构造函数,然后使用该流读取 XML),或者
  2. 使用全局互斥锁(将非空名称传递给Mutex 构造函数)。

如果文件已被锁定,选项 (1) 将不会阻塞(它只会立即抛出异常) -如果要模拟阻塞行为,则必须重复“轮询”文件。另一方面,选项 (2) 仅在您的应用程序是唯一访问该文件的应用程序时才有效。选择你的毒药。

于 2012-04-10T05:22:46.947 回答