C# Asp.net:我的网站坚持说我的文件正在其他进程中使用

C# Asp.net:我的网站坚持说我的文件正在其他进程中使用,c#,asp.net,xml,C#,Asp.net,Xml,我创建了一个站点,需要在其中检查xml文件以获取一些信息。阅读后,我必须重新创建文件,只更改一个位置,类似于: public bool salvarLivro(string sCaminho, Livro liv) { try { string sCaminhoList = sCaminho + "_listaXML.xml"; Thread execGerarLista = new Thread(new

我创建了一个站点,需要在其中检查xml文件以获取一些信息。阅读后,我必须重新创建文件,只更改一个位置,类似于:

public bool salvarLivro(string sCaminho, Livro liv) 
    {
        try
        {
            string sCaminhoList = sCaminho + "_listaXML.xml";
            Thread execGerarLista = new Thread(new ParameterizedThreadStart(gerarListaXml));
            List<string> parametros = new List<string>();
            parametros.Add(sCaminhoList);
            parametros.Add(liv._codigo.ToString());
            execGerarLista.Start(parametros);
            execGerarLista.Join();

            using (XmlTextWriter novoListXML = new XmlTextWriter(sCaminhoList, null)) 
            {
                novoListXML.WriteStartDocument();
                novoListXML.Formatting = Formatting.Indented;
                foreach (Livro li in listXml)
                {
                    novoListXML.WriteStartElement("livro");
                    novoListXML.WriteAttributeString("cod", li._codigo.ToString().PadLeft(3, '0'));
                    if (li._codigo == liv._codigo)
                    {
                        novoListXML.WriteElementString("titulo", liv._titulo);
                    }
                    else
                    {
                        novoListXML.WriteElementString("titulo", li._titulo);
                    }
                    novoListXML.WriteElementString("ultModificacao", li._ultModificacao);
                    novoListXML.WriteEndElement();
                }
                novoListXML.WriteEndElement();
            }
            return true;
        }
        catch (Exception ex)
        {
            this._sErro = ex.Message.ToString();
            return false;
        }
    }
 //to read and save information
 private void gerarListaXml(object parametros) 
    {
        //sCaminho e iCodSelec
        List<string> listParametro = (List<string>)parametros;
        string sCaminho;
        int iCodSelec;
        sCaminho = listParametro[0];
        iCodSelec = int.Parse(listParametro[1]);

        // método para retornar a lista de livros contidas em _listaXML.xml
        List<Livro> listaXml = new List<Livro>();
        Livro liv = new Livro();
        using (XmlTextReader xml = new XmlTextReader(sCaminho)) 
        {
            string sControle = "";
            while (xml.Read())
            {
                //lendo arquivo
                switch (xml.NodeType)
                {
                    //verificando nó de xml
                    case XmlNodeType.Element:
                        switch (xml.Name)
                        {
                            case "livro":
                                liv = new Livro();
                                while (xml.MoveToNextAttribute())
                                {
                                    liv._codigo = int.Parse(xml.Value);
                                }
                                break;
                            case "titulo":
                                sControle = xml.Name;
                                break;
                            case "ultModificacao":
                                sControle = xml.Name;
                                break;
                        }
                        break;
                    case XmlNodeType.Text:
                        switch (sControle)
                        {
                            //verificando nó xml anterior
                            case "titulo":
                                liv._titulo = xml.Value;
                                break;
                            case "ultModificacao":
                                if (liv._codigo == iCodSelec)
                                {
                                    liv._ultModificacao = DateTime.Now.ToString();
                                }
                                else 
                                {
                                    liv._ultModificacao = xml.Value;
                                }
                                //adicionando liv ao listXml
                                listaXml.Add(liv);
                                break;
                        }
                        break;
                }
            }
        }
        listXml = listaXml;
    }

如果在停止之前双击
salvarLivro()
,会怎么样?如何停止和启动它?重新启动机器-这通常会清除访问冲突。您是否尝试过在
gerarListaXml()
中使用
中的
块在
结束之前显式调用
xml.Close()
关闭xml读取器(和底层流)?我也不认为你需要在线程上开始阅读文件…你在哪里用文件
\u listaXML.xml
写评论。在那里检查。可能是您尚未关闭编写器,线程仍在后台运行。此外,如果您发现此错误,请重新启动
IIS
(以杀死当前挂起的线程),如果您可以这样做,或者修改
web.config
文件(如果是共享服务器)。通过在
web.config
中的任意位置添加空格进行修改,然后将其保存。@ZayLau当我说我停止并再次启动它时,我的意思是我停止运行程序并再次运行(我正在使用visual studio 12)重新启动ISS。。。关于double call
salvarLivro()
,在第一次尝试时,它运行得很好,但是当重新启动all时,什么都不起作用如果在停止之前double call
salvarLivro()
?如何停止和启动它?重新启动机器-这通常会清除访问冲突。您是否尝试过在
gerarListaXml()
中使用
中的
块在
结束之前显式调用
xml.Close()
关闭xml读取器(和底层流)?我也不认为你需要在线程上开始阅读文件…你在哪里用文件
\u listaXML.xml
写评论。在那里检查。可能是您尚未关闭编写器,线程仍在后台运行。此外,如果您发现此错误,请重新启动
IIS
(以杀死当前挂起的线程),如果您可以这样做,或者修改
web.config
文件(如果是共享服务器)。通过在
web.config
中的任意位置添加空格进行修改,然后将其保存。@ZayLau当我说我停止并再次启动它时,我的意思是我停止运行程序并再次运行(我正在使用visual studio 12)重新启动ISS。。。关于double call
salvarLivro()
,在第一次尝试时,它运行正常,但是当重新启动all时,一切都不起作用
using (XmlTextWriter novoListXML = new XmlTextWriter(sCaminhoList, null))