写一个多线程程序 读写XML文件的时候出现 
     正由另一进程使用,因此该进程无法访问该文件  
的错误。代码如下        /// <summary>
        /// 查找XML文件中的值
        /// </summary>
        /// <param name="XmlPath">XML路径</param>
        /// <param name="keys">需要查找XML中的哪个Key</param>
        /// <returns>string</returns>
        public string GetXmlMessage(string keys)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XmlPath);
            string XmlValue = "";
            XmlNode xNode;
            XmlElement xElement1;
            xNode = xDoc.SelectSingleNode("//appSettings");
            xElement1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + keys + "']");
            if (xElement1 != null)
            {
                XmlValue = xElement1.GetAttribute("value");
            }
            else
            { //没有找到value
                XmlValue = "-1";
            }
            return XmlValue;
        }这样的错误该如何解决呢。  我知道一般不会报这个错误,这个XML 文件被同时使用的几率很小,但是今天就是出现了。不知道各位大侠有没有什么好的建议或者方法。我自己想过在这个XML读写方法类的初始化方法中使用Lock方法,如下面代码        /*
            XML 文档 就是一个 key  一个 value
         */
        private string XmlPath ;//System.Windows.Forms.Application.LocalUserAppDataPath;
        private object obj;        public XmlManager(string XmlName)//XMLFile_TcpServer.xml
        {
            lock (obj)
            {
                XmlPath = System.Windows.Forms.Application.StartupPath;
                XmlPath = XmlPath + XmlName;
                //XmlPath = XmlPath.Replace(@"\bin\Release", XmlName);
                //XmlPath = XmlPath.Replace(@"\bin\Debug", XmlName);
                LogManager.WriteLog(LogFile.Warning, "XmlPath:" + XmlPath);
            }
        }
对lock的使用不是很了解。 不知道这样写有没有问题呢?

解决方案 »

  1.   

    如果你的xml文档在进程中只是进行读操作,可以打开时用共享的方式。
    xDoc.Load(XmlPath);
    改成
                System.IO.FileStream fs = new FileStream("XmlPath", FileMode.Open, FileAccess.Read, FileShare.Read);
                xDoc.Load(fs);
      

  2.   

    你出现 操作文件的地方,即一般会涉及到文件流,这时你应该记住,文件流的处理 应该 处理完毕,即时关闭流通常会有 .Close();函数, 而且一般你可以写在 finally块里面 .
      

  3.   

    如果有文件流的话,不用的时候要调用其close()方法,我最近也碰到过一个类似的问题