在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类。

请建议任何其他方法来做到这一点,或者建议上面代码中的错误。

谢谢。

在C#中foreach循环中花费大量时间的进程

这确实是因为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