TFS API 缓慢
TFS API Slowness
我正在为 Visual Studio 2013/Team Foundation Server 2012 编写扩展。
我有一个带有树视图和列表视图的用户控件。树视图显示所选团队项目中的分支,以及所有子文件夹。列表视图列出了所选文件夹中包含的文件以及每个文件的一些基本信息,例如上次签入日期、上次进行更改的用户等。
我首先拉取所选文件夹中的项目,然后获取每个项目的最新变更集:
Public Sub GetSourceControlDetailDefault(ByVal strFolder As String, Optional recursionType__1 As RecursionType = RecursionType.OneLevel)
SourceControlListViewItems.Clear()
Dim serverItem As String = strFolder + "/"
Dim itemSet As ItemSet = Nothing
Dim spec As New ItemSpec(serverItem, recursionType__1)
itemSet = TfsShared.Instance.Vcs.GetItems(spec, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File, False)
For Each item In itemSet.Items
Dim chgDetail As Changeset = GetDetails(item.ChangesetId.ToString(), item.ServerItem.ToString())
SourceControlListViewItems.Add(New ItemClass(item, chgDetail))
Next
End Sub
Public Function GetDetails(ByVal cID As String, iName As String) As Changeset
Dim serverItem As String = iName
Dim latest As Changeset
Dim version As New ChangesetVersionSpec(cID)
latest = TfsShared.Instance.Vcs.QueryHistory(serverItem, VersionSpec.Latest, 0, RecursionType.None, Nothing, version, _
version, 1, False, False, False).Cast(Of Changeset)().First()
Return latest
End Function
Public Property SourceControlListViewItems() As ObservableCollection(Of ItemClass)
Get
Return m_SourceControlListViewItems
End Get
Set(value As ObservableCollection(Of ItemClass))
m_SourceControlListViewItems = value
End Set
End Property
Private m_SourceControlListViewItems As ObservableCollection(Of ItemClass)
我的 ItemClass 实现了 INotifyPropertyChanged 并具有 get/set 我正在提取的详细信息。
一切正常 - 我得到了正确显示的信息。问题是它非常慢。包含 20 个项目的文件夹需要 8 秒才能加载。包含 129 个项目的文件夹需要 40 秒才能加载。我们的文件夹包含的项目远远超过 129 个。
如果我只加载项目,速度会非常快。只有当我为每个项目拉出变更集时,它才会变慢。不幸的是,我想要显示的大部分信息都没有包含在该项目中。
我可以做些什么来提高效率吗?这个速度是没法用的
谢谢!
感谢艾哈迈德·伊利亚斯让我以不同的方式思考这个问题。
拉出 itemSet 后,我现在在一个查询中获取所选文件夹的所有变更集,并将它们存储在局部变量中。然后我可以在本地拉取适当的变更集。即使是包含 600 多个文件的文件夹现在也只需 3 秒即可加载。
Public Sub GetSourceControlDetailDefault(ByVal strFolder As String, Optional recursionType__1 As RecursionType = RecursionType.OneLevel)
SourceControlListViewItems.Clear()
Dim serverItem As String = strFolder + "/"
Dim itemSet As ItemSet = Nothing
Dim spec As New ItemSpec(serverItem, recursionType__1)
itemSet = TfsShared.Instance.Vcs.GetItems(spec, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File, False)
GetFolderChangesets(strFolder)
For Each item In itemSet.Items
Dim chgDetail As Changeset = GetChangesetDetails(item.ChangesetId.ToString())
SourceControlListViewItems.Add(New ItemClass(item, chgDetail ))
End If
Next
End Sub
Public Sub GetFolderChangesets(ByVal strFolder As String)
Dim serverItem As String = strFolder + "/*"
Dim spec As New ItemSpec(serverItem, RecursionType.Full)
Dim versionFrom As New ChangesetVersionSpec(1)
m_folderChangesets = TfsShared.Instance.Vcs.QueryHistory(serverItem, VersionSpec.Latest, 0, RecursionType.Full, Nothing, versionFrom, _
VersionSpec.Latest, Integer.MaxValue, False, False, False).Cast(Of Changeset)().ToList()
End Sub
Public Property FolderChangesets() As List(Of Changeset)
Get
Return m_folderChangesets
End Get
Set(value As List(Of Changeset))
m_folderChangesets = value
End Set
End Property
Private m_folderChangesets As List(Of Changeset)
我正在为 Visual Studio 2013/Team Foundation Server 2012 编写扩展。
我有一个带有树视图和列表视图的用户控件。树视图显示所选团队项目中的分支,以及所有子文件夹。列表视图列出了所选文件夹中包含的文件以及每个文件的一些基本信息,例如上次签入日期、上次进行更改的用户等。
我首先拉取所选文件夹中的项目,然后获取每个项目的最新变更集:
Public Sub GetSourceControlDetailDefault(ByVal strFolder As String, Optional recursionType__1 As RecursionType = RecursionType.OneLevel)
SourceControlListViewItems.Clear()
Dim serverItem As String = strFolder + "/"
Dim itemSet As ItemSet = Nothing
Dim spec As New ItemSpec(serverItem, recursionType__1)
itemSet = TfsShared.Instance.Vcs.GetItems(spec, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File, False)
For Each item In itemSet.Items
Dim chgDetail As Changeset = GetDetails(item.ChangesetId.ToString(), item.ServerItem.ToString())
SourceControlListViewItems.Add(New ItemClass(item, chgDetail))
Next
End Sub
Public Function GetDetails(ByVal cID As String, iName As String) As Changeset
Dim serverItem As String = iName
Dim latest As Changeset
Dim version As New ChangesetVersionSpec(cID)
latest = TfsShared.Instance.Vcs.QueryHistory(serverItem, VersionSpec.Latest, 0, RecursionType.None, Nothing, version, _
version, 1, False, False, False).Cast(Of Changeset)().First()
Return latest
End Function
Public Property SourceControlListViewItems() As ObservableCollection(Of ItemClass)
Get
Return m_SourceControlListViewItems
End Get
Set(value As ObservableCollection(Of ItemClass))
m_SourceControlListViewItems = value
End Set
End Property
Private m_SourceControlListViewItems As ObservableCollection(Of ItemClass)
我的 ItemClass 实现了 INotifyPropertyChanged 并具有 get/set 我正在提取的详细信息。
一切正常 - 我得到了正确显示的信息。问题是它非常慢。包含 20 个项目的文件夹需要 8 秒才能加载。包含 129 个项目的文件夹需要 40 秒才能加载。我们的文件夹包含的项目远远超过 129 个。
如果我只加载项目,速度会非常快。只有当我为每个项目拉出变更集时,它才会变慢。不幸的是,我想要显示的大部分信息都没有包含在该项目中。
我可以做些什么来提高效率吗?这个速度是没法用的
谢谢!
感谢艾哈迈德·伊利亚斯让我以不同的方式思考这个问题。
拉出 itemSet 后,我现在在一个查询中获取所选文件夹的所有变更集,并将它们存储在局部变量中。然后我可以在本地拉取适当的变更集。即使是包含 600 多个文件的文件夹现在也只需 3 秒即可加载。
Public Sub GetSourceControlDetailDefault(ByVal strFolder As String, Optional recursionType__1 As RecursionType = RecursionType.OneLevel)
SourceControlListViewItems.Clear()
Dim serverItem As String = strFolder + "/"
Dim itemSet As ItemSet = Nothing
Dim spec As New ItemSpec(serverItem, recursionType__1)
itemSet = TfsShared.Instance.Vcs.GetItems(spec, VersionSpec.Latest, DeletedState.NonDeleted, ItemType.File, False)
GetFolderChangesets(strFolder)
For Each item In itemSet.Items
Dim chgDetail As Changeset = GetChangesetDetails(item.ChangesetId.ToString())
SourceControlListViewItems.Add(New ItemClass(item, chgDetail ))
End If
Next
End Sub
Public Sub GetFolderChangesets(ByVal strFolder As String)
Dim serverItem As String = strFolder + "/*"
Dim spec As New ItemSpec(serverItem, RecursionType.Full)
Dim versionFrom As New ChangesetVersionSpec(1)
m_folderChangesets = TfsShared.Instance.Vcs.QueryHistory(serverItem, VersionSpec.Latest, 0, RecursionType.Full, Nothing, versionFrom, _
VersionSpec.Latest, Integer.MaxValue, False, False, False).Cast(Of Changeset)().ToList()
End Sub
Public Property FolderChangesets() As List(Of Changeset)
Get
Return m_folderChangesets
End Get
Set(value As List(Of Changeset))
m_folderChangesets = value
End Set
End Property
Private m_folderChangesets As List(Of Changeset)