c# - 使用 c# 事件保护 XML 访问
问题描述
假设我需要为存储在 XML 文件中的实体提供执行 CRUD 操作的类。问题是将从事件中调用此 CRUD 方法。我是否需要使用 lock 关键字来保护应用免受多次访问异常?
我提供了一些示例代码,如果有人可以调查一下以判断这是否是正确的方法,我将不胜感激。
private static readonly object SyncObject = new object();
public void Delete(MyFile entity)
{
if (entity != null)
{
lock (SyncObject)
{
XDocument xDocument;
using (StreamReader stream = new StreamReader(MyFileXmlPath))
{
xDocument = XDocument.Load(stream);
}
xDocument.Descendants("ArrayOfMyFile")
.Elements()
.Where(e => Convert.ToInt32(e.Attribute("Id").Value) == entity.Id)
.Remove();
xDocument.Save(MyFileXmlPath);
}
}
}
public IEnumerable<MyFile> GetAll()
{
XDocument xDocument = XDocument.Load(MyFileXmlPath);
List<MyFile> MyFiles = xDocument
.Root
.Descendants("MyFile")
.Select(f => new MyFile
{
Id = Convert.ToInt32(f.Attribute("Id").Value),
FilePath = f.Element("FilePath").Value,
//... other properties
})
.ToList();
return MyFiles;
}
public void Insert(MyFile entity)
{
if (entity != null)
{
lock (SyncObject)
{
XDocument xDocument;
try
{
using (StreamReader stream = new StreamReader(MyFileXmlPath))
{
xDocument = XDocument.Load(stream);
}
entity.Id = GetFreeId(xDocument);
MyFile fileToSave = (MyFile)entity;
XElement newFile = MapMyFile(fileToSave);
xDocument.Root.Add(newFile);
xDocument.Save(MyFileXmlPath);
}
catch (Exception exception)
{
//...
}
}
}
}
public void Update(MyFile entity)
{
if (entity != null)
{
lock (SyncObject)
{
XDocument xDocument;
try
{
using (StreamReader stream = new StreamReader(MyFileXmlPath))
{
xDocument = XDocument.Load(stream);
}
XElement updatedFile = xDocument.Descendants("ArrayOfMyFile")
.Elements()
.Where(e => Convert.ToInt32(e.Attribute("Id").Value) == entity.Id)
.FirstOrDefault();
if (updatedFile != null)
{
updatedFile.ReplaceWith(MapMyFile(entity));
}
xDocument.Save(MyFileXmlPath);
}
catch (Exception exception)
{
//...
}
}
}
}