首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >的并行处理

的并行处理
EN

Stack Overflow用户
提问于 2016-04-27 15:10:50
回答 1查看 184关注 0票数 0

我正在尝试将大量的(大约12000块)批量插入到我自己的数据模型中。我读出来非常直截了当:

代码语言:javascript
复制
        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;
        }

然后,我会以一种并行的方式运行它们,并映射到我自己的模型:

代码语言:javascript
复制
    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;
    }

我的问题是:当我试图访问工作项字段时,例如:

代码语言:javascript
复制
    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-模型中是否有任何已知的机制,其中有一些共享列表,或者我在这里做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-04-27 17:11:55

你期待发生什么?在线程中使用线程不安全的集合:

代码语言:javascript
复制
        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 )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36893859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档