线程在 System.Xml.XmlDocument.LoadXml(String xml) 处被中止



我正在循环浏览10,000个项目并将数据导出到excel中。

如果我将循环限制为 2k 或 3k 项目,则没有问题。 一切正常,数据将被导出。 但是当循环用于 10k 项时,它的抛出线程在 5k 项后中止异常。

在循环中,我正在加载3 个 xml 文档。异常也会在 System.Xml.XmlDocument.LoadXml(String xml( 上引发。

以下是我的代码供您参考:

XmlDocument siteAdminXmlDocument = new XmlDocument();
XmlDocument engagementXmlDocument = new XmlDocument();
XmlDocument requestXmlDocument = new XmlDocument();
foreach (var request in provisioningRequests)
{
//Load SiteAdmin XML
siteAdminXmlDocument.LoadXml("<engagementAdministrators xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></engagementAdministrators>");
string siteAdminXmlData = request.SiteAdminsXml;
if (siteAdminXmlData != null)
{
siteAdminXmlDocument.LoadXml(siteAdminXmlData);
}
//Load Engagement XML
engagementXmlDocument.LoadXml("SyncXml xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></SyncXml>");
string engagementXmlData = request.EngagementXml;
if (engagementXmlData != null)
{
engagementXmlDocument.LoadXml(engagementXmlData);
}
//Load Request XML
requestXmlDocument.LoadXml("<engagementRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></engagementRequest>");
string requestXmlData = request.RequestXml;
if (requestXmlData != null)
{
requestXmlDocument.LoadXml(requestXmlData);
}
////Here I'm getting data from xml nodes & writing to the Response//////
}

错误:

Thread was being aborted.                               
at System.Threading.Monitor.Enter(Object obj)                               
at System.Xml.XmlElementListListener.OnListChanged(Object sender, XmlNodeChangedEventArgs args)                                  
at System.Xml.XmlNodeChangedEventHandler.Invoke(Object sender, XmlNodeChangedEventArgs e)                                    
at System.Xml.XmlElement.AppendChildForLoad(XmlNode newChild, XmlDocument doc)                                   
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)                                 
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)                                   
at System.Xml.XmlDocument.Load(XmlReader reader)                                 
at System.Xml.XmlDocument.LoadXml(String xml)

注意:所有 10,000 个项目都具有相同的数据。(即那些是数据库表中单个项目的 10k 个副本,即虚拟数据(

在谷歌搜索时,我发现了一些解决方案,但没有一个适用于这种情况。有人知道为什么会这样吗?任何帮助将不胜感激。

最后,我找到了这个问题的原因和解决方案。

在 ASP.NET 中,任何 HTTP 请求的默认执行超时为 110 秒(.NET Framework 1.0 和 1.1 为 90 秒(。如果请求超过指定的执行超时,则它将被 ASP.NET 自动中止。

所以就我而言,我们循环遍历了超过 10k 个项目,其默认执行超时为 110 秒,然后线程自动中止。

因此,解决方案是,在应用程序的 web.config 文件中增加执行超时。

<httpRuntime executionTimeout = "HH:MM:SS"/>

<httpRuntime executionTimeout = "Seconds"/>

更可靠的解决方案是,与其增加整个应用程序的执行超时,不如只针对正在执行长时间运行进程的特定页面增加执行超时。为此,您可以通过代码来完成,而无需修改web.config。设置1小时(3600秒(

Page.Server.ScriptTimeout = 3600;

希望这可以帮助遇到相同问题的人。谢谢。

最新更新