我们目前正在调查一个问题,根据防火墙提供商的说法,我们有时会打开大约 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的选择中仅指定几个字段时,您仍然可以访问其他字段...这是相当缓慢的。如果我选择以后通过索引器访问的所有字段,它会快得多。根据这一观察结果,我会说:是的,沟通是开放的。