目前我正在开发一个从TFS获取信息的项目 试图建立一个自定义工具
我决定提高该工具的性能,并且使用Parallel选项(.Net 4 +)遇到了1个问题
备注:我已尝试在查询结果和项目上放置安全线程,但它没有帮助代码示例位于底部
我正在尝试执行下一个代码:
WorkItemCollection queryResults;
//Query run to populate the collection
Parallel.ForEach<WorkItem>(queryResults.Cast<WorkItem>(), item => {
Console.WriteLine(item.Fields.GetById(AttributeCode.Default.RemainingWork).Value);
});
错误引用:
Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll中出现“Microsoft.TeamFoundation.TeamFoundationServiceUnavailableException”类型的异常,但未在用户代码中处理
从Exception Catch记录:
mscorlib.dll中出现'System.InvalidOperationException'类型的第一次机会异常 System.InvalidOperationException:集合已被修改;枚举操作可能无法执行。 在System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource资源) 在System.Collections.Generic.Dictionary
2.KeyCollection.Enumerator.MoveNext() at Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessFields(Int32 row, IEnumerable
1 fieldIds,Dictionary2 fields) at Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessRevision(Int32 row, Dictionary
2 rowMap,Dictionary2 plainFields, Dictionary
2 textFields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.Read(Int32 row,Int32 [] fields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemCollection.QueryFieldValues(Int32 index,Int32 [] fields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_IsAccessDenied() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.QueryFieldValue(Int32字段) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemFieldData.GetFieldValue(Int32 id,Int32 revision) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.CheckUpdateCachedData() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_Type() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_Fields()
对项目进行阻止保护,不确定我是否做得对:
WorkItemCollection queryResults;
//Query run to populate the collection
BlockingCollection<WorkItem> bc = new BlockingCollection<WorkItem>();
WorkItem temp;
Parallel.ForEach<WorkItem>(queryResults.Cast<WorkItem>(), item =>
{
bc.Add(item);
if (bc.TryTake(out temp))
Console.WriteLine(temp.Fields[CoreField.CreatedBy]);
});
错误:
mscorlib.dll中出现'System.InvalidOperationException'类型的第一次机会异常 mscorlib.dll中发生了'System.InvalidOperationException'类型的第一次机会异常 System.InvalidOperationException:集合已被修改;枚举操作可能无法执行。 在System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource资源) 在System.Collections.Generic.Dictionary
2.KeyCollection.Enumerator.MoveNext() at Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessFields(Int32 row, IEnumerable
1 fieldIds,Dictionary2 fields) at Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessRevision(Int32 row, Dictionary
2 rowMap,Dictionary2 plainFields, Dictionary
2 textFields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.Read(Int32 row,Int32 [] fields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemCollection.QueryFieldValues(Int32 index,Int32 [] fields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_IsAccessDenied() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.QueryFieldValue(Int32字段) 在Microsoft.TeamFoundation.S-QA Tasks.exe中出现类型'System.InvalidOperationException'的第一次机会异常 WorkItemTracking.Client.WorkItemFieldData.GetFieldValue(Int32 id,Int32 revision) 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.CheckUpdateCachedData() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_Type() 在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_Fields() System.InvalidOperationException:集合已被修改;枚举操作可能无法执行。 在System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource资源) 在System.Collections.Generic.Dictionary2.KeyCollection.Enumerator.MoveNext() at Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessFields(Int32 row, IEnumerable
1 fieldIds,Dictionary`2 fields) 在Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessRevision(Int32 row,D