Xml文件并发读写的解决方法

简介:   之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况。通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问题。

  之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况。通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问题。

  测试方法:开两个线程读写同一个文件。主要是FileStream对象里面的三个参数FileMode,FileAccess,FileShared的枚举值选择。

    class Program
    {
        private static string path = AppDomain.CurrentDomain.BaseDirectory + "cache.xml";
        static void Main(string[] args)
        {
            Thread th1 = new Thread(Writexml);
            th1.Start();
            Thread th2 = new Thread(Readxml);
            th2.Start();

        }

        static void Writexml()
        {
            while (true)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine(String.Format("<Cache name=\"{0}\">", "aa"));
                sb.AppendLine(String.Format("<Subkey name=\"{0}\">", "bb"));
                sb.AppendLine(String.Format("<Data><![CDATA[{0}]]></Data>", "{\"Value\":[{\"BindingType\":\"net.tcp\",\"ServiceIP\":\"192.168.1.226\",\"ServicePort\":\"9420\",\"SvcPath\":\"HotelPayNotifyService.svc\"}]}"));
                sb.AppendLine("</Subkey>");
                sb.AppendLine("</Cache>");
                using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
                    fs.Write(bytes, 0, bytes.Length);
                }
                Thread.Sleep(200);
            }
        }

        static void Readxml()
        {
            while (true)
            {
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(fs);
                    XmlNode dataNode = doc.SelectSingleNode(String.Format("Cache/Subkey[@name='{0}']/Data", "bb"));
                    Console.WriteLine(dataNode.InnerText);
                }
                Thread.Sleep(100);
            }
        }

    }

  这样的情况还是比较正常,在几百毫秒的情况下,这样的能够满足大部分要求了。

另:还遇到了关于Dictionary并发的问题,声明了一个静态的Dictionary对象,通过深度复制来保证并发读写不会抛异常。处理的代码如下:

            Dictionary<String, Dictionary<String, Object>> newdic = new Dictionary<string, Dictionary<string, object>>();

            using (MemoryStream ms = new MemoryStream())
            {
                IFormatter formator = new BinaryFormatter();
                formator.Serialize(ms, dic);
                ms.Seek(0, SeekOrigin.Begin);
                newdic=(formator.Deserialize(ms) as Dictionary<String,Dictionary<String,Object>>);
            }

关于对象的复制可以参考这篇文章:浅复制(Shallow Copy)与深复制(Deep Copy)    

上面是最近工作中遇到的问题,记录下方便以后查阅。

相关文章
|
2月前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
48 0
|
11天前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
11 0
|
11天前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
14 0
|
2月前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
【5月更文挑战第10天】BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
42 1
|
6天前
|
XML Java 数据库
配置applicationContext.xml文件
配置applicationContext.xml文件
|
4天前
|
XML Java 数据库
配置applicationContext.xml文件
配置applicationContext.xml文件
|
6天前
|
XML JavaScript Java
解析XML文件的几种方法
解析XML文件的几种方法
|
8天前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
|
12天前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
19 3
|
12天前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
28 3