WorkItemTrackingHttpClient

WorkItemTrackingHttpClient

我正在尝试从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时,一切运行正常,并按预期方式检索项目,并通过选择将其转换为类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,有人可以向我阐明一下可能是内存泄漏吗?

最佳答案

看来这是设计使然。调试代码时,您可以看到第二次检索工作项时,WorkItemTrackingHttpClient缓存在对象m_cachedTypes中,因此您将获得异常“无法访问已处理的对象”。

关于c# - 在WorkItemTrackingHttpClient上调用QueryByIdAsync时获取访问已处置的对象异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59453787/

10-13 06:15