Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用QueryBuilds从TFS查询生成的性能非常低_C#_Tfs_Build_Azure Devops_Azure Pipelines - Fatal编程技术网

C# 使用QueryBuilds从TFS查询生成的性能非常低

C# 使用QueryBuilds从TFS查询生成的性能非常低,c#,tfs,build,azure-devops,azure-pipelines,C#,Tfs,Build,Azure Devops,Azure Pipelines,我正在尝试访问本地TFS 2015服务器中具有“无限期保留”标志(BuildDetail.KeepForeverProperty)的每个版本,但是QueryBuilds()函数花费的时间太长,无法获取所有版本 我真正需要的是KeepForever和DropLocation属性 我发现使用IBuildDetailSpec接口可以获得更好的效率,但是我找不到一个可以获得KeepForever属性的选项 我当前的代码段: public void BackupOnlyRetainedBuilds(字符

我正在尝试访问本地TFS 2015服务器中具有“无限期保留”标志(
BuildDetail.KeepForever
Property)的每个版本,但是
QueryBuilds()
函数花费的时间太长,无法获取所有版本

我真正需要的是
KeepForever
DropLocation
属性

我发现使用
IBuildDetailSpec
接口可以获得更好的效率,但是我找不到一个可以获得
KeepForever
属性的选项

我当前的代码段:

public void BackupOnlyRetainedBuilds(字符串TeamProjectName,字符串DestinationPath)
{
defs[…]
Uri configurationServerUri=新Uri(“http://builder:8080/tfs");
TfsTeamProjectCollection服务器=新的TfsTeamProjectCollection(configurationServerUri);
//获取构建服务器
buildServer=(IBuildServer)server.GetService(typeof(IBuildServer));
//设置SPCIC团队项目中所有生成定义的数组。
IBuildDefinition[]bda=buildServer.QueryBuildDefinitions(TeamProjectName);
//检查每个构建定义。
foreach(bda中的var buildDefinition)
{
//设置构建历史的数组。
IBuildDetail[]bha=buildDefinition.QueryBuilds();
//从生成历史生成详细信息中检查每个生成。
foreach(bha中的var构建细节)
{
//检查是否保留生成。
if(buildDetails.KeepForever==true)
{
字符串dropLocationPath=buildDetails.DropLocation;
//检查放置文件夹是否存在。
if(Directory.Exists(dropLocationPath))
{
//创建所有目录。
foreach(Directory.GetDirectories中的字符串dirPath(dropLocationPath,“*”,
SearchOption.AllDirectories)
CreateDirectory(dirPath.Replace(dropLocationPath,DestinationPath));
//复制所有文件&替换具有相同名称的任何文件。
foreach(Directory.GetFiles(dropLocationPath,*.*)中的字符串newPath),
SearchOption.AllDirectories)
Copy(newPath,newPath.Replace(dropLocationPath,DestinationPath),true);
}
}
}
}
}

您可以告诉
QueryBuilds
不要从我的补丁版本
tfsbuild.exe
中获取所有构建细节,而只获取您感兴趣的构建细节:

buildDetailSpec = this.BuildServer.CreateBuildDetailSpec(...)
buildDetailSpec.QueryDeletedOption = !forDestroy ? QueryDeletedOption.IncludeDeleted : QueryDeletedOption.OnlyDeleted;
buildDetailSpec.InformationTypes = null;
IBuildQueryResult buildQueryResult = this.BuildServer.QueryBuilds(buildDetailSpec);
或者使用
QueryBuildsUri
并将其传递给
(string[])null、QueryOptions。None

IBuildDetail[] buildDetailArray = this.BuildServer.QueryBuildsByUri(list2.ToArray(), (string[]) null, QueryOptions.None, QueryDeletedOption.IncludeDeleted);

您可能需要向其传递一组特定的
信息类型
,具体取决于备份工具中所需的数据。

谢谢<代码>buildDetailSpec.InformationTypes=null&
IBuildQueryResult
实现了这一技巧,但我找不到文档来说明不同信息类型之间的区别,以及为什么为null使其比正常情况快得多。生成时间行中的每个记录和附件都是一个BuildInfo记录。每个记录都有一个类型。查询生成时,默认情况下,在检索或查询生成时,所有记录都将反序列化。这可能会有很多MB的数据需要反序列化并放入内存,我见过在这些记录中包含50+MB数据的构建。通过传递空数组或null,您告诉系统仅返回根记录。这最多是几KB。因此带来了巨大的加速。测试结果和覆盖率以及构建中包含的任何工具输出的每一行,最终都会成为I BuildInfo记录。以下是可以存储在构建中的所有类型信息的列表: