我有以下代码:
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并获得每个组合时,它会做一个浅的副本吗?
答案 0 :(得分:2)
您的原始帖子遗漏了您正在使用EF对象上下文中的对象这一事实。由于这不是线程安全的,因此您无法并行执行所需操作。它可以用来检索所有对象,然后同时对它们进行操作,但我不是EF的专家。
答案 1 :(得分:0)
您应该使用线程安全集合。将您的类型切换为ConcurrentBag<ConcurrentBag<Material>>
作为初学者。此外,看起来你没有显示你在循环中对数组做了什么(代码片段不完整)....如果你希望访问你在循环中构建的任何东西 outside 对于parralel循环,您需要确保它也使用线程安全实现。
您可能在调试器中看到的是由于线程导致的非确定性行为。