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:进程无法访问该文件,因为它正被另一个进程错误使用。
有什么解决方案吗?
很可能您的锁不是独占的,只在类范围内设置。如果您试图获取独占锁,那么您的locker
实例必须是静态的或单例的,并且在文件监视处理程序的所有调用之间共享。实例类中实例化locker
不会共享资源,因为这样的锁在多个线程之间可能不是独占的。
类似以下内容应该允许您拥有可以在线程之间共享的静态实例,以获得独占锁。
static object _locker = new object();