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 命名空間,提供了一個多集是線程安全的。收集 允許你從多線程免費添加和刪除項目 而不必擔心線程同步。 包沒有訂購的事實允許它在 有多個線程或並行任務,其中每個都添加和 刪除項目時特別有效。