当调用WorkItemTrackingHttpClient的QueryByIdAsync方法时,出现访问已释放对象异常

3

我正在尝试从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会不会导致内存泄漏?请有经验的人指点一下。

2个回答

1
我不相信除了VssConnection本身以外,你应该丢弃任何东西。
在微软的示例代码中,个别客户端从未被处理,而且似乎与旧版TFS SDK中的TfsConnection模式相同,即仅处理根对象。

1

看起来是有意为之的。当你调试代码时,你会发现当你第二次检索工作项时,WorkItemTrackingHttpClient 会缓存在对象 m_cachedTypes 中,因此你会得到“无法访问已释放对象”的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接