0

我需要帮助,了解如何解决此比赛情况。下面是代码: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中使用y。

结果结果:在执行任务期间,gridview会自动更改状态。

我对如何克服这个问题想法不多。你能建议什么来解决这个问题吗?

+0

在“做某事”期间会发生什么?它是相关的吗? – 2015-02-10 03:14:01

+0

'do something'根据表名处理数据。一旦完成,它就会更新(或者应该更新)列表中对象的性别。 – Musikero31 2015-02-10 06:56:07

回答

0

我想我找到了答案。它是通过更改List(Of T)ConcurrentBag(Of T)解决了这个问题。按照this link

ConcurrentBag<T>集合,在System.Collections.Concurrent 命名空间,提供了一个多集是线程安全的。收集 允许你从多线程免费添加和删除项目 而不必担心线程同步。 包没有订购的事实允许它在 有多个线程或并行任务,其中每个都添加和 删除项目时特别有效。