为什么Parallel.ForEach循环只执行浅拷贝?

时间:2011-11-25 02:45:14

标签: c# .net-4.0

我有以下代码:

List<List<Material>> materialCombos;
Parallel.ForEach(materialCombos, combination =>
{
   Material material1 = combination[0];
   Material material2 = combination[1];                                              
   double[] tempValues1 =
        material1.MaterialImages
                 .OrderBy(mi => mi.Time)
                 .Select(mi => Convert.ToDouble(mi.Temperature))
                 .ToArray();
});


public class Material
{
        [Key]
        public int MaterialID { get; set; }

        /// <summary>
        /// Name of the material.
        /// </summary>
        public string Name { get; set; }

        // other accessors here...

        /// <summary>
        /// Collection of apparent temperature images with meta-data for this material.
        /// </summary>
        public virtual ICollection<MaterialImage> MaterialImages { get; set; }
}

使用同步foreach循环时,它完全正常。但是,当我使用并行版本(如上所述)时,MaterialImages对象并不总是复制到combination对象,并且在调试器中查看时它是null,因此抛出异常在匿名函数中。

为什么会发生这种情况的任何想法,是因为当它遍历materialCombos并获得每个组合时,它会做一个浅的副本吗?

2 个答案:

答案 0 :(得分:2)

您的原始帖子遗漏了您正在使用EF对象上下文中的对象这一事实。由于这不是线程安全的,因此您无法并行执行所需操作。它可以用来检索所有对象,然后同时对它们进行操作,但我不是EF的专家。

答案 1 :(得分:0)

您应该使用线程安全集合。将您的类型切换为ConcurrentBag<ConcurrentBag<Material>>作为初学者。此外,看起来你没有显示你在循环中对数组做了什么(代码片段不完整)....如果你希望访问你在循环中构建的任何东西 outside 对于parralel循环,您需要确保它也使用线程安全实现。

您可能在调试器中看到的是由于线程导致的非确定性行为。