XmlReader.Create get";进程不能访问该文件,因为它正被另一个进程“使用”;错误

本文关键字:进程 另一个 错误 使用 因为 文件 get Create quot 不能 XmlReader | 更新日期: 2023-09-27 18:20:18

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:进程无法访问该文件,因为它正被另一个进程错误使用。

有什么解决方案吗?

XmlReader.Create get";进程不能访问该文件,因为它正被另一个进程“使用”;错误

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

类似以下内容应该允许您拥有可以在线程之间共享的静态实例,以获得独占锁。

static object _locker = new object();