Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 加载术语集时的性能优化_Vb.net_Sharepoint_Csom - Fatal编程技术网

Vb.net 加载术语集时的性能优化

Vb.net 加载术语集时的性能优化,vb.net,sharepoint,csom,Vb.net,Sharepoint,Csom,我在检索程序(用VB编写)中术语集的术语时遇到问题。术语集有大约300个术语,所有术语都有大约10到70个子术语。我想把所有的术语整合到一个表单中,所以我使用了一个“树视图” 我对术语的检索编码如下:1。创建一个新的clientContext 2。加载TaxonomySession,然后加载TermStore,然后加载TermGroup,最后加载TermSet。术语集的负载如下所示: clientContext.Load(tSet, Function(a As TermSet) a.Terms)

我在检索程序(用VB编写)中术语集的术语时遇到问题。术语集有大约300个术语,所有术语都有大约10到70个子术语。我想把所有的术语整合到一个表单中,所以我使用了一个“树视图”

我对术语的检索编码如下: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
将根目录设置为System.Windows.Forms.TreeNode=New System.Windows.Forms.TreeNode(tSet.Name)
orgatree.TopNode=tvroot'orgatree是树视图
对于tSet.术语中的每个tterm As术语
Load(tterm,函数(作为术语)w.Name)
加载(tterm,函数(作为术语)w.Id)
加载(tterm,函数(作为术语)w.TermsCount)
下一个
clientContext.ExecuteQuery()文件
Dim tvroot As System.Windows.Forms.TreeNode=新的System.Windows.Forms.TreeNode(tSet.Name)
orgatree.TopNode=tvroot
对于tSet.术语中的每个tterm As术语
Dim tvanode As System.Windows.Forms.TreeNode=新的System.Windows.Forms.TreeNode(tterm.Name)
tvanode.ToolTipText=tterm.Id.ToString
tvroot.Nodes.Add(tvanode)
如果tterm.TERMCOUNT为0,则
treefilling(tvanode、clientContext、tterm)'一种方法,在下面的一个额外片段中显示
如果结束
下一个
以及“树填充”方法:

公共函数树填充(父函数为System.Windows.Forms.TreeNode,clientContext为clientContext,term为term)
将tvnode设置为System.Windows.Forms.TreeNode
加载(术语、函数(作为术语)和术语)
clientContext.ExecuteQuery()文件
对于每个tterm,术语为术语。术语
Load(tterm,函数(作为术语)w.Name)
加载(tterm,函数(作为术语)w.Id)
加载(tterm,函数(作为术语)w.TermsCount)
下一个
clientContext.ExecuteQuery()文件
对于每个tterm,术语为术语。术语
tvnode=New System.Windows.Forms.TreeNode(tterm.Name)
tvnode.ToolTipText=tterm.Id.ToString
parent.Nodes.Add(tvnode)
'clientContext.ExecuteQuery()
如果tterm.TERMCOUNT为0,则
树填充(tvnode、clientContext、tterm)
如果结束
下一个
端函数
现在开始解决问题


这个代码不是很快。加载所有数据最多需要3或4分钟。我已经尝试过优化它了。早期版本有更多不必要的“executeQuery()”行。但这项计划仍然缓慢。是否有更快的方法加载一个术语集的所有数据并将其集成到一个表单中(例如在treeview中)?

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

因此,请使用多个线程同时加载多个术语/术语集。您需要编写线程安全代码,检索多个线程通过客户机对象模型同时查询托管元数据服务的位置,小心地将请求总数限制在某个合理的数目(例如一次8个请求)内,以免服务器过载


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

这里不讨论这个问题。最好在CodeReview()中发布此类问题。
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