多个应用程序访问相同的文件

时间:2013-01-24 13:10:01

标签: c# multithreading mutex

 **This is Writer Application**     

  public class LogWritter
          {      
           Mutex mutx = new Mutex(false, @"Global\MySharedLog");
           mutx.WaitOne();
            try
            {
             xmlDoc.Load(_logFilePath);
              ///Write Log Code
              xmlDoc.Save(_logFilePath);
            }
            finally
            {
                mutx.ReleaseMutex();
            }
          }

这是Reader Application

  public class LogReader
         { 
             Load(logFilePath);
              //Reader code    
         }

我正在编写ABC.XML文件中的日志。这个XML文件可以由多个进程共享,这就是为什么我使用Mutex对象进行锁定的意思,如果一个进程正在编写日志,那么同时另一个进程是使用Mutex.Waitone()方法在第一个进程完成写入日志并最终释放mutext对象时等待传入进程。 我有另一个Reader应用程序,我想使用ABC.xml文件阅读目的如何在Reader应用程序中使用mutext对象?

2 个答案:

答案 0 :(得分:2)

  1. 从此处复制/粘贴SingleGlobalInstance类:What is a good pattern for using a Global Mutex in C#?

  2. 将您的代码更改为:

      // writer app
      public class LogWritter
      {   
          using (new SingleGlobalInstance(-1))
          {   
              xmlDoc.Load(_logFilePath);
              //Write Log Code
              xmlDoc.Save(_logFilePath);
          }
      }
    
     // reader app
     public class LogReader
     { 
          using (new SingleGlobalInstance(-1))
          {   
              Load(logFilePath);
          }
          //Reader code    
     }
    

答案 1 :(得分:1)

您希望这是静态的,这样有人就不会意外地创建一个新实例并获得不同的互斥锁。

public static class FileMutexes
{
    private static System.Collections.Generic.Dictionary<string, System.Threading.Mutex> mutexesInUse = new System.Collections.Generic.Dictionary<string, System.Threading.Mutex>();

    public static System.Threading.Mutex GetMutexForFile(string fileName)
    {
        if (!mutexesInUse.ContainsKey(fileName))
            mutexesInUse[fileName] = new System.Threading.Mutex();

        return mutexesInUse[fileName];
    }
}