TFS对象模型:WorkItems是否保持会话打开?

时间:2018-01-17 17:24:29

标签: c# tfs tfs-workitem tfs-sdk

我们目前正在调查一个问题,根据防火墙提供商的说法,我们有时会打开大约1500个并行会话。我强烈怀疑,我们的TFS-Replication是一种服务,它通过TFS对象模型从外部TFS获取工作项并将一些数据保存到本地SQL数据库中,这导致了这个问题。

对对象模型的访问如下所示:

        internal static async Task<IReadOnlyCollection<WorkItem>> QueryWorkItemsAsync(string wiqlQuery)
        {
            var tfsConfig = TFSConfiguration.Instances[Constants.TfsPrefix.External];
            var uri = new Uri(tfsConfig.WebbaseUri);
            var teamProject = new TfsTeamProjectCollection(uri, new VssBasicCredential(string.Empty, ConfigurationManager.AppSettings[Infrastructure.Constants.APP_SETTINGS_TFS_PAT]));
            var workItemStore = teamProject.GetService<WorkItemStore>();

            var query = new Query(workItemStore, wiqlQuery, null, false);

            var result = await Task.Run(
                () =>
                {
                    var castedWorkItems = query.RunQuery().Cast<WorkItem>();
                    return castedWorkItems.ToList();
                });

            return result;
        }

没什么太花哨的:可以将WIQL传递给方法。目前,我正在获取块,因此WIQL看起来像

            var wiql = "SELECT * FROM WorkItems";
            wiql += $" WHERE [System.Id] > {minWorkItemId}";
            wiql += $" AND [System.Id] <= {maxWorkItemId}";
            wiql += " ORDER BY [System.Id] DESC";

我几乎没有对这个WorkItems做任何事情,除了映射他们的一些字段,但不写,保存或任何东西。我没有得到关于我正在使用的关于打开Sessions的对象的任何暗示,并且WorkItem-Objects本身只是非常短暂地存在于内存中。

我在这里遗漏了什么,可以解释该服务中的公开会话吗?

2 个答案:

答案 0 :(得分:2)

客户端对象模型做了很多事情:

  • 为每个用户/项目集合组合保留一个连接池,以加快数据传输速度。
  • 需要获取您点击的每个工作项修订。
  • 从查询中实现的每个工作项仅包含查询中选择的字段,正在访问的其他字段将按需提取。

TFSTeamprojectCollection类实现IDisposable,必须偶尔清理一次以确保连接关闭。在内部缓存中进行维护,但它确保连接已关闭。

将此代码包装在try / catch块中或通过依赖注入提供Team Project Collection并在更高级别管理连接可能是个好主意(否则您的其他字段将无法填充)。

答案 1 :(得分:1)

我不知道工作项目背后的细节,但我发现当你在wiql的选择中指定只有几个字段,你仍然可以访问其他字段......而且这是相当慢的。如果我选择后来通过索引器访问的所有字段,它会快得多。 从那个观察我会说:是的,沟通是开放的。