次のループを並列ループに変換するのを手伝ってください。私は HashSet の代わりに Parallel.ForEach と ConcurrentBag を使用しようとしましたが、「Matched」が毎回異なる結果を返すということです。
私はそれを理解することはできません.それはスレッドの安全性の問題のためですか?
キーワード リストには、約 500 の一意の文字列が含まれており、それぞれの長さは 1 ~ 3 語です。
アイテムには約 10000 個のアイテムが含まれています。
元のコード:
Dim Items As IEnumerable(Of Item) = Db.Items.GetAll
Dim Keywords As HashSet(Of String)
Dim Matched As HashSet(Of Item)
For Each Item In Items
For Each Keyword In Keywords
If Regex.IsMatch(Headline, String.Format("\b{0}\b", Keyword), RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant) Then
If Not Matched.Contains(Item) Then
Matched.Add(Item)
End If
End If
Next
Next
に変換してみる
Dim Items As IEnumerable(Of Item) = Db.Items.GetAll
Dim Keywords As HashSet(Of String)
Dim Matched As Concurrent.ConcurrentBag(Of Item)
Threading.Tasks.Parallel.ForEach(Of Item)(Items, Sub(Item)
For Each Keyword In Keywords
If Regex.IsMatch(Item.Title, String.Format("\b{0}\b", Keyword), RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant) Then
If Not Matched.Contains(Item) Then
Matched.Add(Item)
End If
Continue For
End If
Next
End If