博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xml文件并发读写的解决方法
阅读量:6228 次
发布时间:2019-06-21

本文共 2508 字,大约阅读时间需要 8 分钟。

之前对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("
", "aa")); sb.AppendLine(String.Format("
", "bb")); sb.AppendLine(String.Format("
", "{\"Value\":[{\"BindingType\":\"net.tcp\",\"ServiceIP\":\"192.168.1.226\",\"ServicePort\":\"9420\",\"SvcPath\":\"HotelPayNotifyService.svc\"}]}")); sb.AppendLine("
"); sb.AppendLine("
"); 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>>);
            }

关于对象的复制可以参考这篇文章:    

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

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/p/worknotes-8.html如需转载请自行联系原作者

张雪飞

你可能感兴趣的文章
jQuery 下拉列表 二级联动插件
查看>>
jQuery的样式篇
查看>>
QT(4)信号与槽
查看>>
(转)jieba中文分词的.NET版本:jieba.NET
查看>>
PHP 反射机制
查看>>
jQuery手风琴效果
查看>>
oracle调度中使用schedule管理调度
查看>>
Ubuntu 14.04 Remmina远程桌面连接Windows计算机
查看>>
php 在linux系统下写出文件问题
查看>>
将EXCEL转为HTML有什么好办法?
查看>>
了解一下Elasticsearch的基本概念
查看>>
二、let变量声明方式介绍
查看>>
iOS逆向:在任意app上开启malloc stack追踪内存来源
查看>>
【BZOJ】4033: [HAOI2015]树上染色 树上背包
查看>>
python学习三:列表、元组、字典、集合
查看>>
iOS中使用UISegmentControl进行UITableView切换
查看>>
自适应响应式,手机,平板,PC,java企业网站源码
查看>>
【CodeForces】835F Roads in the Kingdom
查看>>
2014.4.17—openflow代码流程
查看>>
leetcode-414-Third Maximum Number
查看>>