使用TFS SDK查询源控制权限时的性能问题

时间:2013-08-27 14:56:01

标签: c# .net performance networking tfs

正如标题所示,我对TFS存在性能问题。这个问题似乎与版本无关,我在TFS 2012和TFS 2010中遇到过它。

我正在为TFS开发一个权限管理工具。当用户选择团队项目集合和特定项目时,我启动查询,获取所有源控件项权限,然后构建缓存。在开发过程中,我测试了一些小的本地项目,我没有注意到性能问题,但是在一些更大的项目(5000多个文件)中,查询变得非常慢。

我使用VersionControlServer.GetPermissions method进行此查询。

我试图调用它只给出带有RecursionType.Full的根项,但是我没有收到所有项权限,只有那些经过身份验证的用户具有显式权限的项目权限(我猜)。

所以我调用方法给出项目的所有项目,并将递归设置为RecursionType.None。以下是代码的重要部分:

    ItemSet projectItems = VersionControlServer
                    .GetItems(projectRootItem, RecursionType.Full);
    IEnumerable<string> serverItems = projectItems.Items
                                            .Select(i => i.ServerItem);
    IEnumerable<ItemSecurity> itemSecurities = VersionControlServer
                    .GetPermissions(serverItems.ToArray(), RecursionType.None);

我希望最后一行能够对TFS进行一次调用,但是当我分析应用程序时,我看到有一些不合理的http请求,11993个7800个文件的请求,并且该方法运行了大约2个分钟。

我花了很多时间试图找到这种行为的原因而没有成功。我也找不到TFS SDK中的一个好的替代解决方案。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我有一件事。

您的查询非常慢,因为首先,您将所有projectItems.Items放到列表中,然后,当您将其作为参数传递给方法VersionControlService.GetPermissions()时,使用{{1}将其转换为数组导致复制列表中的所有项目。

我建议你不要将项目转换为ToArray()。请改用List