2

次のループを並列ループに変換するのを手伝ってください。私は 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
4

1 に答える 1