TFS 对象模型:工作项是否使会话保持打开状态



我们目前正在调查一个问题,根据防火墙提供商的说法,我们有时会打开大约 1500 个并行会话。我强烈怀疑我们的 TFS 复制(一种通过 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";

除了映射他们的一些字段,但我几乎什么都不做,但没有编写、保存或任何东西。我没有得到任何关于我正在使用的有关打开会话的对象的任何提示,而且工作项对象本身在内存中只是非常短暂的寿命。

我在这里错过了一些可以解释该服务中的开放会话的内容吗?

客户端对象模型执行许多操作:

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

类实现 IDisposable,必须不定期清理以确保连接关闭。在内部缓存中得到维护,但它确保连接被关闭。

最好将此

代码包装在 try/catch 块中,或者通过依赖项注入提供团队项目集合,并在更高级别管理连接(否则将无法填充其他字段(。

我不知道

工作项类背后的细节,但我观察到,当您例如在wiql的选择中仅指定几个字段时,您仍然可以访问其他字段...这是相当缓慢的。如果我选择以后通过索引器访问的所有字段,它会快得多。根据这一观察结果,我会说:是的,沟通是开放的。

最新更新