XmlReader.Create得到“进程无法访问该文件,因为它被另一个进程使用”错误

时间:2014-09-02 16:26:42

标签: c# file-io xmlreader filesystemwatcher

我在FileSystemWatcher文件创建的事件中有以下代码。因此,无论何时创建文件,它都将运行以下代码:

    private static void FileWatch_RequestAdded(object sender, FileSystemEventArgs e)
    {
          try
          {
              RequestFile request = GetRequest(e.FullPath);

              EventHandler<MESRequestEventArgs> requestReceived = Instance.RequestReceived;
              if (requestReceived != null)
                 requestReceived(Instance, new MESRequestEventArgs(e.Name, request));               
          }
          catch (Exception error)
          {
               MessageBox.Show(error.ToString());
          }
    }

private static object locker = new object();

public static RequestFile GetRequest(string filepath)
{
     string filename = Path.GetFileName(filepath);
     RequestFile file = new RequestFile(filename);        

     XmlReaderSettings settings = new XmlReaderSettings();
     settings.ValidationType = ValidationType.None;

     lock (locker)
     {
         using (XmlReader reader = XmlReader.Create(filepath, settings))
         {
             XmlSerializer serializer = new XmlSerializer(typeof(RequestFile));
             file = serializer.Deserialize(reader) as RequestFile;                    
         }
    }

     file.Name = filename;           
     return file;
}

问题是当同时创建多个文件时,有时会抛出异常:System.IO.IOException:进程无法访问该文件,因为它被另一个进程错误使用。

任何解决方案?

1 个答案:

答案 0 :(得分:0)

很可能你的锁不是独占的,只能在类范围内设置。如果您尝试获取独占锁,那么您的locker实例必须是静态的或单例并且在文件监视处理程序的所有调用之间共享。在实例类中实例化locker将不会被共享资源,因为这样的锁可能不是多个线程之间的独占。

以下内容应该允许您拥有可以在线程中共享的静态实例以进行独占锁定。

static object _locker = new object();