我正在尝试将大量的(大约12000块)批量插入到我自己的数据模型中。我读出来非常直截了当:
internal static async Task<IEnumerable<WorkItem>> GetAllWorkItemsAsync()
{
var allItems = await Task.Run(() =>
{
var result = _workItemStore.Query(@"SELECT * FROM WorkItems").Cast<WorkItem>().ToList();
return result;
});
return allItems;
}然后,我会以一种并行的方式运行它们,并映射到我自己的模型:
internal async Task<IEnumerable<Model.WorkItem>> GetAllWorkItemsAsync()
{
var allWorkItems = await QueryHelper.GetAllWorkItemsAsync();
var result = await Task.Factory.StartNew(() =>
{
var res = new List<Model.WorkItem>();
Parallel.ForEach(allWorkItems, wi =>
{
var item = new Model.WorkItem();
_mapper.MapCoreData(wi, item);
_mapper.MapCustomData(wi, item);
_mapper.MapLinks(wi, item);
res.Add(item);
});
return res;
}, TaskCreationOptions.LongRunning);
return result;
}我的问题是:当我试图访问工作项字段时,例如:
internal void MapCustomData(WorkItem source, Model.WorkItem target)
{
var sponsor = source.Fields["Sponsor"]?.Value.ToString();
var requirementType = source.Fields["Requirement Type"]?.Value.ToString();
target.WorkItemCustomData = new Model.WorkItemCustomData
{
Sponsor = sponsor,
RequirementType = requirementType,
WorkItemId = target.Id
};
}我得到以下例外:
“System.InvalidOperationException”类型的异常发生在mscorlib.dll中,但未在用户代码中处理 其他信息:集合已被修改;枚举操作可能不会执行。
有趣的是,我从不改变价值观,只会阅读它们并填写我自己的模型。
TFS-模型中是否有任何已知的机制,其中有一些共享列表,或者我在这里做错了什么?
发布于 2016-04-27 17:11:55
你期待发生什么?在线程中使用线程不安全的集合:
var res = new List<Model.WorkItem>();
Parallel.ForEach(allWorkItems, wi =>
{
var item = new Model.WorkItem();
_mapper.MapCoreData(wi, item);
_mapper.MapCustomData(wi, item);
_mapper.MapLinks(wi, item);
res.Add(item);
});
return res;要么锁定访问集合以提供线程安全,要么使用固有的线程安全集合(如ConcurrentBag )。
https://stackoverflow.com/questions/36893859
复制相似问题