【问题标题】:Process taking lots of time in foreach loop in C#在 C# 的 foreach 循环中花费大量时间的进程
【发布时间】:2011-08-30 20:55:24
【问题描述】:

我正在使用 C# 代码和 Tridion(CMS) 类从 Tridion 获取数据,下面是从 Tridion 获取所有出版物列表的代码。

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

请建议任何其他方式来执行此操作或建议上述代码中的错误。

谢谢。

【问题讨论】:

  • 也许 TridionCollection 枚举器很糟糕?
  • 这是什么意思,请指教
  • 尝试通过索引或键正常迭代它(不知道这个类的性质),看看是否有任何区别。其他解释是延迟加载,如下所示。以防万一我还建议在此操作期间查看内存使用情况...

标签: c# tridion


【解决方案1】:

确实是因为 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 和标题,那么您必须单独加载每个出版物,这可以通过使用 ID 属性 tdse.GetObject() 来完成。

希望这会有所帮助。 否

【讨论】:

    【解决方案2】:

    根据this,我认为这是开发人员网站...看起来 getAllPublicationList 正在使用某种延迟加载,因此即使您拥有集合,但实际上并没有其中的项目。

    您似乎可以在他们的集合上设置过滤器,而不是事后,这样它只会加载您感兴趣的记录。

    澄清一下,延迟加载意味着当集合返回时,填充其中的项目所需的数据尚未加载。直到您访问集合中的项目时,才会实际加载该项目的数据(例如,通过创建发布项目)。使用惰性集合的目的是允许对集合进行过滤,从而避免不必要的昂贵负载。

    HTH

    【讨论】:

    • 我亲爱的朋友 Yaur,该列表不需要任何时间,只有当我要制作 Publication 类对象时才需要时间
    • @Manu 我在答案中添加了一些文本,您描述的行为与通过惰性集合枚举时的预期一致。
    • 谢谢@Yaur,您能否建议我可以做些什么来避免延迟加载。
    • @Manu 你无法避免它,如果可以的话,你会回到这里询问为什么这个系列需要这么长时间才能创建。您需要做的是使用它。看起来他们希望您在枚举之前使用称为 ListRowFilter 的东西来预过滤集合。
    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多