Parallel.Foreach里面的Race条件

时间:2015-02-09 11:18:48

标签: vb.net list task-parallel-library race-condition parallel.foreach

我需要有关如何解决这种竞争条件的帮助。以下是代码:

Task.Factory.StartNew(Sub()
                        ' Do something...
                        dim newPeople as new List(Of Person)
                        dim myNames as ConcurrentBag(Of String) = GetNames()

                        Parallel.ForEach(myNames, Sub(name)
                                            Dim person as new Person
                                            person.Name = name
                                            person.Gender = "MALE"

                                            newPeople.Add(person)
                                            GridView.BeginInvoke(Sub()
                                                                    GridView.DataSource = newPeople
                                                                End Sub)

                                            ' Do something...

                                            dim index as Integer = newPeople.FindIndex(Function(p) p.Name = name) ' Race condition error
                                            newPeople(index).Gender = "FEMALE"

                                            GridView.Invoke(Sub()
                                                                    GridView.DataSource = newPeople
                                                                End Sub)

                                        End Sub)

                     End Sub, param ,TaskCreationOptions.None)

这段代码基本上是这样的:

  • 设置对象中人员的姓名和性别
  • 在人员列表中添加此人物对象
  • 在网格视图中显示(显示之前和之后)
  • 做某事后,改变人的性别
  • 在person元素更新后在gridview中显示。

最终结果:gridview将在执行任务期间自动更改状态。

我已经没有关于如何克服这个问题的想法了。你能建议解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。通过将List(Of T)更改为ConcurrentBag(Of T)来解决问题。根据{{​​3}}

  

System.Collections.Concurrent中的ConcurrentBag<T>集合   namespace,提供一个线程安全的多集。这个系列   允许您从多个线程中自由添加和删除项目   ,无需担心线程同步。事实   袋子没有订购,使它在特别有效时   你有多个线程或并行任务,每个都添加和   删除项目。