C# 不可捕获的IOException

C# 不可捕获的IOException,c#,asp.net,.net,C#,Asp.net,.net,使用XDocument.Load()读取XML文件的ASPX.NET应用程序。有时,它会抛出一个IOException static,说明文件无法打开,因为它正被另一个进程使用。我无法通过打开文件并重新加载站点来随意重新创建此文件。但更奇怪的是,异常发生在Try-Catch块中,我在其中显式捕获System.IOException 以下是堆栈: 异常类型:IOException 线程信息: 线程ID:18 线程帐户名称:NT授权\网络服务 是模仿:假 堆栈跟踪:在System.IO.\u Err

使用XDocument.Load()读取XML文件的ASPX.NET应用程序。有时,它会抛出一个IOException static,说明文件无法打开,因为它正被另一个进程使用。我无法通过打开文件并重新加载站点来随意重新创建此文件。但更奇怪的是,异常发生在Try-Catch块中,我在其中显式捕获System.IOException

以下是堆栈:

异常类型:IOException

线程信息: 线程ID:18 线程帐户名称:NT授权\网络服务 是模仿:假 堆栈跟踪:在System.IO.\u Error.WinIOError(Int32 errorCode,字符串maybeFullPath) 在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、Int32缓冲大小、文件选项选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、布尔useLongPath) 位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问权限、文件共享共享、Int32 bufferSize) 在System.Xml.XmlDownloadManager.GetStream(Uri、ICredentials凭据、IWebProxy代理、RequestCachePolicy cachePolicy) 位于System.Xml.XmlUrlResolver.GetEntity(Uri绝对Uri、字符串角色、对象类型返回) 位于System.Xml.XmlReaderSettings.CreateReader(字符串inputUri,XmlParserContext inputContext) 在System.Xml.XmlReader.Create(字符串输入URI、XmlReaderSettings设置、XmlParserContext输入上下文) 位于System.Xml.Linq.XDocument.Load(字符串uri,LoadOptions) 位于System.Xml.Linq.XDocument.Load(字符串uri)

位于removedpath\StatTick\Controls\ChartSlider.ascx.cs中的StatTick.Controls.ChartSlider.getXMLFile(字符串url):第27行 在removedpath\StatTick\Controls\ChartSlider.ascx.cs中的StatTick.Controls.ChartSlider.Page_加载(对象发送器,事件参数e):第21行

代码如下:

private XDocument getXMLFile(string url)
    {
        XDocument tempDoc;

        t("Looking For XML File");
        int tryCount = 0;
        //string URL = "~/tempCharts/imageList.xml";
        while (tryCount++ < 10)
        {

            try
            {
                tempDoc = XDocument.Load(Server.MapPath(url));
                return tempDoc;
            }
            catch (IOException)
            {
                t("Error accessing XML File, sleeping for 10ms and then trying again\r\nTryCount: " + tryCount.ToString());
                Thread.Sleep(10);
                continue;

            }
        }

        return null;
    }
private XDocument getXMLFile(字符串url)
{
xdocumenttempdoc;
t(“查找XML文件”);
int tryCount=0;
//字符串URL=“~/tempCharts/imageList.xml”;
while(tryCount++<10)
{
尝试
{
tempDoc=XDocument.Load(Server.MapPath(url));
返回tempDoc;
}
捕获(IOException)
{
t(“访问XML文件时出错,休眠10毫秒,然后重试\r\nTryCount:+tryCount.ToString());
睡眠(10);
继续;
}
}
返回null;
}
希望有人能为我提供一些关于这件事的见解

谢谢

编辑 好的,这就是我所做的,我必须做一些测试,以验证它不再抛出感谢快速响应!:

while (tryCount <= 10)
        {
            try
            {
                using (FileStream fStream = new FileStream(Server.MapPath(url), FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    XDocument xDoc = XDocument.Load(fStream);

                    foreach (XElement xe in xDoc.Descendants("ImageUrl"))
                    {
                        t("Added: " + xe.Value);
                        tempImageUrlList.Add(xe.Value);
                    }
                    t("Done with Image List!");
                }
                return tempImageUrlList;
            }
            catch (Exception)
            {
                t("Error access XML File, sleeping for 10ms and then trying again\r\nTryCount: " + tryCount.ToString());
                Thread.Sleep(10);
                continue;
            }
        }

while(tryCount我认为错误是由于文件的访问权限,因此请授予文件的读/写权限,然后尝试读取文件。

我认为错误是由于文件的访问权限,因此请授予文件的读/写权限,然后尝试读取文件。

改用流并使用它加载文件您可以确保使用using语句关闭了底层流

using (Stream s = File.OpenRead(Server.MapPath(url)))
{
        XDocument.Load(s);
}


改用流,并使用它加载XML。您可以确保使用using语句关闭底层流

using (Stream s = File.OpenRead(Server.MapPath(url)))
{
        XDocument.Load(s);
}


我正在做一些测试,一旦我得到一些可靠的结果,我会把它作为答案。谢谢!我正在做一些测试,一旦我得到一些可靠的结果,我会把它作为答案。谢谢!