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)    

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

时间: 2024-10-23 10:18:37

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

Log4Net 生成多个文件、文件名累加解决方法

Log4Net 生成多个文件.文件名累加解决方法 项目中的WCF服务里采用Log4Net用来记录异常日志,但部署后,生成的日志会出现多个累加文件,如下图: WCF是寄宿在IIS上,包含了5个SVC服务.打开日志文件,发现记录的引发异常的Thread ID都不一样,猜测是多线程读写日志文件, 配置信息里指定文件的被占用后,重新建立了新的日志文件,删除日志文件也会出现警告信息: 解决方法: 在appender节点里添加: <param name="lockingModel" type

遍历-使用的是rapidxml对xml文件进行修改删除的方法?

问题描述 使用的是rapidxml对xml文件进行修改删除的方法? 已经对xml文件进行了遍历,把需要标记为1的那一行xml数据删除请问该怎么写例子abc=1 .....<abc>abc=0 .....<abc> 现在我写一个判断为0的我从文件中去掉,过滤之后文件只剩下abc=1 ...<abc>请问该如何解决?

fckeditor在jsp文件上传失败解决方法

fckeditor在jsp教程文件上传失败解决方法 我的代码如下 web.xml <servlet> <servlet-name>connector</servlet-name> <servlet-class>net.fckeditor.connector.connectorservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet&g

win8系统删除文件无权限的解决方法

win8系统删除文件无权限的解决方法   1.鼠标移动到左下方开始的地方,接着点击右键右键,在弹出的菜单里面直接选中"命令提示符(管理员)"选项. 2.用cd命令进入删除文件夹的上一层目录(比如C:Program FilesiTools),接着就可以试用del命令删除. 3.发现del命令无效之后,就直接换用rd命令删除,即,删除成功.

Win8系统不能打开Exe文件的原因及解决方法

  Win8系统不能打开Exe文件的原因及解决方法: 一.Exe文件打不开的原因 1.电脑文件本身有问题, 可以通过看文件本身大小和是不是可以在XP系统上面正常打开来判断. 2.电脑的系统不支持该文件类型的时候. 3.病毒把扩展名为Exe的文件关联删除或修改了. 二.Exe文件打不开解决办法 1.重新下载文件,下载前建议最好是查杀下病毒,就能解决定电脑文件本身的问题; 2.电脑不支持文件类型打开时就会提示,要你选择打开的方式,遇到这种情况,可以去下载文件相对应的格式安装包,就能正常打开了; 3.

php的webservice的wsdl的XML无法显示问题的解决方法

本篇文章是对php的webservice的wsdl的XML无法显示问题的解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 php的webservice的因为wsdl有中文所以xml无法显示 可以用Nopepad++ 转码即可 以UTF-8无BOM编码  

JS使用ajax从xml文件动态获取数据显示的方法

 这篇文章主要介绍了JS使用ajax从xml文件动态获取数据显示的方法,实例分析了javascript使用Ajax技术操作XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS使用ajax从xml文件动态获取数据显示的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码通过ajax检索xml文件的内容动态展示到网页,真个页面无刷新 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2

win7文件夹不能搜索解决方法

  文件夹搜索不能用怎么办?小编带来了win7文件夹不能搜索解决方法,文件夹搜索功能能够帮助我们提高搜索文件的速度,当出现不能用的故障该如何解决呢?请看下文. 问题原因是因为一个服务没有开,我们依次点击"控制面板-程序-程序和功能-打开或关闭windows功能-勾选windows search和index service"即可解决问题.

Win7系统搜索文件速度慢的解决方法

  平常我们会使用windows系统自带的搜索功能来搜索要查找的文件或资料,而win7系统文件搜索是基于索引的,一般是默认搜索库文件夹.开始菜单.电子邮件等等文件,很多用户反映win7搜索文件速度很慢,这很是影响到我们的工作效率,其实我们是可以直接来对搜索项目和索引选项进行设置来提高搜索速度,一起来看看下面的设置教程吧. 1. 在"任务栏"空白处单击右键,在弹出菜单中选择"属性"打开"任务栏和'开始'菜单属性"窗口,点击"自定义&quo