加载术语集时的性能优化

Performance Optimization when loading term sets

我在检索程序中的术语集时遇到问题(写在 VB 中)。术语集大约有 300 个术语,所有术语都有大约 10 到 70 个子术语。我想将所有术语整合到一个表格中,所以我为此使用了 "Treeview"。

我对术语的检索编码如下:1. 创建一个新的 clientContext 2. 加载 TaxonomySession,然后是 TermStore,然后是 TermGroup,最后是 TermSet。术语集的负载如下所示:

clientContext.Load(tSet, Function(a As TermSet) a.Terms)
    clientContext.Load(tSet, Function(a As TermSet) a.Name)

之后是 "ExecuteQuery()" 然后我有以下内容:

Dim tvroot As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode(tSet.Name)
    orgatree.TopNode = tvroot 'orgatree is the treeview
For Each tterm As Term In tSet.Terms
            clientContext.Load(tterm, Function(w As Term) w.Name)
            clientContext.Load(tterm, Function(w As Term) w.Id)
            clientContext.Load(tterm, Function(w As Term) w.TermsCount)
        Next
        clientContext.ExecuteQuery()
        Dim tvroot As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode(tSet.Name)
        orgatree.TopNode = tvroot
        For Each tterm As Term In tSet.Terms
            Dim tvanode As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode(tterm.Name)
            tvanode.ToolTipText = tterm.Id.ToString
            tvroot.Nodes.Add(tvanode)
            If tterm.TermsCount <> 0 Then
                treefilling(tvanode, clientContext, tterm) 'a method which is shown in an extra snippet below this one
            End If
        Next

和方法"treefilling":

Public Function treefilling(parent As System.Windows.Forms.TreeNode, clientContext As ClientContext, term As Term)
    Dim tvnode As System.Windows.Forms.TreeNode
    clientContext.Load(term, Function(w As Term) w.Terms)
    clientContext.ExecuteQuery()
    For Each tterm As Term In term.Terms
        clientContext.Load(tterm, Function(w As Term) w.Name)
        clientContext.Load(tterm, Function(w As Term) w.Id)
        clientContext.Load(tterm, Function(w As Term) w.TermsCount)
    Next
    clientContext.ExecuteQuery()
    For Each tterm As Term In term.Terms
        tvnode = New System.Windows.Forms.TreeNode(tterm.Name)
        tvnode.ToolTipText = tterm.Id.ToString
        parent.Nodes.Add(tvnode)
        ' clientContext.ExecuteQuery()
        If tterm.TermsCount <> 0 Then
            treefilling(tvnode, clientContext, tterm)
        End If
    Next
End Function

现在进入问题

这段代码不是很快。加载所有数据最多需要 3 或 4 分钟。我已经尝试优化它。早期版本有更多不必要的 "executeQuery()" 行。但是程序还是要慢。 是否有更快的方法来加载术语集的所有数据并将其集成到表单中(例如在树视图中)?

无论您是在表单中加载数据还是其他无关紧要的内容。相关的是通过 SharePoint 2013 CSOM 获取条款的过程。请记住,CSOM 是用于在客户端和 SharePoint 2013 服务器之间来回发送 Xml 请求的包装器。

所以,使用多线程同时加载多个terms/termsets。您需要编写线程安全的代码来检索多个线程通过客户端对象模型同时查询托管元数据服务的位置,注意将请求总数限制在某个合理的数量(比如一次 8 个请求)不要让服务器超载。

访问服务器的多个线程可以工作,因为这是一个 READ 操作。