我正在尝试从TFS检索项目,以执行自动文档更改并填写尽可能多的信息,以减少为客户做文档工作(如发布说明等)所花费的时间。
我使用以下方法来检索项,该方法是一个类的一部分,都包含在正文中:
方法:
public IEnumerable<DTO.WorkItem> GetWorkItemsFromQuery(string queryId)
{
using (WorkItemTrackingHttpClient witClient = connection.GetClient<WorkItemTrackingHttpClient>())
{
var queryResults =
witClient
.QueryByIdAsync(teamProjectName, new Guid(queryId))
.Result;
if (queryResults != null)
{
return queryResults
.WorkItems
.Select(item =>
{
var workitem = witClient.GetWorkItemAsync(item.Id).Result;
workitem.Fields.TryGetValue("DescriptionField", out object descriptionObject);
workitem.Fields.TryGetValue("TitleField", out object titleObject);
return new DTO.WorkItem()
{
Id = item.Id.ToString(),
Title = titleObject?.ToString() ?? string.Empty,
Description = descriptionObject?.ToString() ?? string.Empty
};
}).ToList();
}
return default(IEnumerable<DTO.WorkItem>);
}
}
}
类:
public class VSTSIssueTrackerExplorer
{
VssConnection connection;
private readonly string teamProjectName;
public VSTSIssueTrackerExplorer(string tfsDefaultCollectionPath,
string personalAccessToken,
string teamProjectName)
{
connection =
new VssConnection(
new Uri(tfsDefaultCollectionPath),
new VssBasicCredential(string.Empty, personalAccessToken));
this.teamProjectName = teamProjectName;
}
public IEnumerable<DTO.WorkItem> GetWorkItemsFromQuery(string queryId)
{
using (WorkItemTrackingHttpClient witClient = connection.GetClient<WorkItemTrackingHttpClient>())
{
var queryResults =
witClient
.QueryByIdAsync(teamProjectName, new Guid(queryId))
.Result;
if (queryResults != null)
{
return queryResults
.WorkItems
.Select(item =>
{
var workitem = witClient.GetWorkItemAsync(item.Id).Result;
workitem.Fields.TryGetValue("DescriptionField", out object descriptionObject);
workitem.Fields.TryGetValue("TitleField", out object titleObject);
return new DTO.WorkItem()
{
Id = item.Id.ToString(),
Title = titleObject?.ToString() ?? string.Empty,
Description = descriptionObject?.ToString() ?? string.Empty
};
}).ToList();
}
return default(IEnumerable<DTO.WorkItem>);
}
}
}
我第一次调用 GetWorkItemsFromQuery
时,一切都很顺利,按预期检索到项目,并使用 select 转换为一个名为 WorkItem
的类,如下所示:
public class WorkItem
{
public string Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
我已经检索到这些项后,如果再次尝试检索它们,会出现以下异常: System.AggregateException("Cannot Access Disposed Object")
如果我删除using块,我可以根据需要多次调用它,所以我完全没有问题。
我想知道的是,WorkItemTrackingHttpClient
是否设计为在VssConection本身被处理时被处理或者当我不再需要它时可以处理它,我在网上搜索,但似乎找不到任何与此相关的内容。
如果不在using块中使用WorkItemTrackingHttpClient
会不会导致内存泄漏?请有经验的人指点一下。