在C#中foreach循环中花费大量时间的进程
本文关键字:时间 进程 foreach 循环 | 更新日期: 2023-09-27 17:57:27
我使用C#代码和Tridion(CMS)类从Tridion获取数据,下面是从Tridio获取所有出版物列表的代码。
protected void btnPublishPublicationList_Click(object sender, EventArgs e)
{
try
{
PublicationBL pubBL = new PublicationBL();
TridionCollection<Publication> pubAllList = pubBL.getAllPublicationList();
List<PublicationsBO> pubBos = new List<PublicationsBO>();
foreach (Publication pub in pubAllList)
{
if ((pub.Title.StartsWith("07"))||(pub.Title.StartsWith("08")))
{
PublicationsBO pubBO = new PublicationsBO();
pubBO.publicationID = pub.ID;
pubBO.publicationName = pub.Title;
pubBos.Add(pubBO);
}
}
pubBL.createPublicationListXML(pubBos);
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
在上面的代码上点击按钮,我使用.net代码并使用Tridion类获得所有出版物列表如下:
TridionCollection<Publication> pubAllList = pubBL.getAllPublicationList();
我很快就从Tridion获得了我的所有出版物列表,然而,当我进行foreach循环时,我的过程会被卡住,这需要很多时间。
foreach (Publication pub in pubAllList)
{
if ((pub.Title.StartsWith("07"))||(pub.Title.StartsWith("08")))
{
PublicationsBO pubBO = new PublicationsBO();
pubBO.publicationID = pub.ID;
pubBO.publicationName = pub.Title;
pubBos.Add(pubBO);
}
}
调试后,我发现当调试器使用foreach (Publication pub in pubAllList)
时,它需要花费大量时间。我认为在制作Publication类对象时需要花费时间,它是Tridion类。
请建议任何其他方法来做到这一点,或者建议上面代码中的错误。
谢谢。
这确实是因为Tridion的懒惰加载。如果你只需要一份出版物ID和标题的列表,我建议你使用:
TDSE tdse = new TDSEClass():
XmlDocument publicationList = new XmlDocument();
publicationList.LoadXml(tdse.GetListPublications(ListColumnFilter.XMLListIDAndTitle));
这将为您提供一个XML文档,其中包含所有发布的列表(/tcm:ListPublications/tcm:Item),每个Item都将包含一个Title和ID属性。
如果您需要比ID和Title更多的详细信息,则必须单独加载每个出版物,这可以通过使用ID属性tdse来完成。GetObject()。
希望这能有所帮助。N
根据这个我认为是开发人员的网站。。。看起来getAllPublicationList使用了某种惰性加载,所以即使你有集合,你也没有真正的项目。
看起来你可以在他们的集合上设置过滤器,而不是在事实之后,这样它只会加载你感兴趣的记录。
需要说明的是,延迟加载意味着当返回集合时,填充其中项目所需的数据尚未装入。直到您访问集合中的项,该项的数据(例如,通过创建发布项)才真正加载。使用惰性集合的目的是允许对集合进行筛选,从而避免不必要的昂贵加载。
HTH