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