我的应用程序中运行了一些代码,它为多个学生调用以下方法。
问题是我使用 Student 并行索引变量来调用另一个方法,并使用该方法的局部变量插入一条消息记录并保存该 Student 的所有消息一次。
有时会发生的情况是插入数据库的消息有时具有错误的 ownerId。
例如,一条由 StudentRecord Id 10 拥有的消息被插入到数据库中,其所有者 Id 值设置为 17 而不是 10。17 是同一类中的一个 studentId,但它似乎与并行循环混淆了。
对于我对并行循环的理解,循环内的所有内容都将具有自己的局部变量实例,因此索引 Student 将创建自己的局部变量块,因此我看不到 StudentId 是如何错误地插入到数据库中的。
一定是发生了一些糟糕的分享。这不是实际使用的数据或变量。我只是尽量简化。
var students = GetAllStudentsForThisClass();
Parallel.ForEach(
students,
new ParallelOptions {
MaxDegreeOfParallelism = 5
},
student => {
var dbThread = new StudentLifeRepository();
var studentRecord = dbThread.GetStudentById(student.Id);
var records = new List<Student_Messages>();
do {
StudentMessage.Statuses = //web api call, returns null when no Statuses are available from api
foreach (var studentMessage in StudentMessage.Statuses) {
var message = new Student_Messages();
//this is where I think the problem lies
message.ownerId = studentRecord.StudentId;
message.CreatedDate = studentMessage.MessageDate;
message.ID = studentMessage.MessageId;
message.message = studentMessage.message;
records.Add(studentMessage);
}
//this loop happens until No more messages are available for this student
} while(StudentMessage.Statuses != null);
//DistinctItemComparer is making sure All messageIds
//are unique since that is used for primary key
foreach (var pt in records.Distinct(new DistinctItemComparer())) {
dbThread.Add(pt);
dbThread.Save();
}
}
); //close of parallel loop