首页 > 解决方案 > 使用 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)
            {
                //...
            }
        }
    }
}

标签: c#.netxmleventslinq-to-xml

解决方案


推荐阅读