C#并行ForEach未处理用户代码,用于工作项字段信息检索
目前我正在进行一个项目,从TFS获取信息 正在尝试构建自定义工具 我已决定改进该工具的性能,但使用并行选项(.Net 4+)时遇到了一个问题 备注:我曾尝试将安全线程放在queryresults上,代码示例位于底部 我正在尝试执行下一个代码:C#并行ForEach未处理用户代码,用于工作项字段信息检索,c#,tfs,tfs-workitem,workitem,C#,Tfs,Tfs Workitem,Workitem,目前我正在进行一个项目,从TFS获取信息 正在尝试构建自定义工具 我已决定改进该工具的性能,但使用并行选项(.Net 4+)时遇到了一个问题 备注:我曾尝试将安全线程放在queryresults上,代码示例位于底部 我正在尝试执行下一个代码: WorkItemCollection queryResults; //Query run to populate the collection Parallel.ForEach<WorkItem>
WorkItemCollection queryResults;
//Query run to populate the collection
Parallel.ForEach<WorkItem>(queryResults.Cast<WorkItem>(), item => {
Console.WriteLine(item.Fields.GetById(AttributeCode.Default.RemainingWork).Value);
});
错误:
mscorlib.dll中发生类型为“System.InvalidOperationException”的第一次意外异常
mscorlib.dll中发生类型为“System.InvalidOperationException”的第一次意外异常
System.InvalidOperationException:集合已修改;枚举操作不能执行。
在System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource资源)处
在System.Collections.Generic.Dictionary2.KeyCollection.Enumerator.MoveNext()中
位于Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessFields(Int32行,IEnumerable
1字段ID,Dictionary2字段)
在Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessRevision(Int32行,Dictionary
2行映射,Dictionary2普通字段,Dictionary
2文本字段)
位于Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.Read(Int32行,Int32[]字段)
位于Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemCollection.QueryFieldValue(Int32索引,Int32[]字段)
在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.get_IsAccessDenied()中
位于Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.QueryFieldValue(Int32字段)
在Microsoft.TeamFoundation中,SW-QA Tasks.exe中发生了类型为“System.InvalidOperationException”的首次意外异常
WorkItemTracking.Client.WorkItemFieldData.GetFieldValue(Int32 id,Int32修订版)
在Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.CheckUpdateCachedata()中
在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()中
位于Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessFields(Int32行,IEnumerable
1字段ID,Dictionary`2字段)
在Microsoft.TeamFoundation.WorkItemTracking.Client.PagingFieldReader.ProcessRevision(Int32行,D
queryResults
是线程安全的集合吗?不是,它不是线程安全的集合。此处一定缺少某些内容。正如错误所述,正在修改集合。修改集合的代码在哪里?(FWIW,Parallel.ForEach
可能与此问题无关——这是一个常见的问题,每当您在循环该集合的内容时修改集合时都会发生)。James我同意,但在使用仅打印项测试代码后,如果我尝试打印项.Fields,则每件事都很好[CoreField.CreatedDate]它失败您需要将queryResults复制到BlockingCollection或将queryResults实例化为BlockingCollection。queryResults是线程安全的集合吗?不是,它不是线程安全的集合这里一定缺少某些内容。正如错误所述,正在修改集合。修改集合的代码在哪里?(FWIW,Parallel.ForEach
可能与此问题无关——这是一个常见的问题,每当您在循环该集合的内容时修改集合时都会发生)。James我同意,但在使用仅打印项测试代码后,如果我尝试打印项.Fields,则每件事都很好[CoreField.CreatedDate]失败您需要将queryResults复制到BlockingCollection或将queryResults实例化为BlockingCollection。
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]);
});