我需要有关如何解决这种竞争条件的帮助。以下是代码:
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)
这段代码基本上是这样的:
最终结果:gridview将在执行任务期间自动更改状态。
我已经没有关于如何克服这个问题的想法了。你能建议解决这个问题吗?
答案 0 :(得分:0)
我想我找到了答案。通过将List(Of T)
更改为ConcurrentBag(Of T)
来解决问题。根据{{3}}
System.Collections.Concurrent中的
ConcurrentBag<T>
集合 namespace,提供一个线程安全的多集。这个系列 允许您从多个线程中自由添加和删除项目 ,无需担心线程同步。事实 袋子没有订购,使它在特别有效时 你有多个线程或并行任务,每个都添加和 删除项目。