我写了一些代码来尝试描述我的担忧:
static void Main(string[] args)
{
IEnumerable<decimal> marks = GetClassMarks();
IEnumerable<Person> students = GetStudents();
students.AsParallel().ForAll(p => GenerateClassReport(p, marks));
Console.ReadKey();
}
GetClassMarks 使用来自我奇怪的数据源的收益返回。假设 GenerateClassReport 基本上是用 mark.Sum()/marks.Count() 来获得班级平均值。
据我了解,students.AsParallel().ForAll 是一个并行的 foreach。
我担心的是 GetClassMarks 方法内部会发生什么。
- 它会被枚举一次还是多次?
- 枚举将以什么顺序发生?
- 我是否需要在标记上执行 .ToList() 以确保它只被击中一次?