Parallel ForEach confusion .Net C#

本文关键字:Net confusion ForEach Parallel | 更新日期: 2023-09-27 18:30:39

我的应用程序中运行了一些代码,可以为多个学生调用下面的方法。

问题是我使用 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

Parallel ForEach confusion .Net C#

您似乎正在使用静态或外部范围的属性:StudentMessage.Statuses from a thread。这将导致问题,因为静态属性将在所有线程之间共享。当一个线程为该属性分配新值时,它将影响其他线程。