0

私は、ウェブサイトからデータを取得するプログラムを持っています。つまり、最初にカテゴリとサブカテゴリを取得し、カテゴリテーブルに保存します。次に、対応するカテゴリの URL にヒットし、製品を取得します。

カテゴリの URL をトラバースする外側のループと、ページネーションを処理する内側のループ、および製品を取得するもう 1 つの内側のループがあります。

これが私のコードです

For item As Integer = 0 To tempTable.Rows.Count - 1
'main loop

     For cycleCount As Integer = -1 To pageNodes.Count - 1
      'pagination loop

       For Each product As HtmlNode In products
         'retrive products here 
       Next


     Next

Next

通常、私のコードは正常に動作しています。しかし、マルチスレッドを適用したい。そのため、メイン ループで TPL (Task Parallel Library) を使用しました。

すなわち

Parallel.For(0, tempTable.Rows.Count - 1, Sub(item)
'main loop

     For cycleCount As Integer = -1 To pageNodes.Count - 1
      'pagination loop

       For Each product As HtmlNode In products
         'retrive products here 
       Next


     Next

End Sub)

2 から 4 のレコードのみが挿入されていますが、アイテムが重複しており、その後コードがクラッシュしますこのエラーが発生しました:「1 つ以上のエラーが発生しました」

では、コードにマルチスレッドを実装するにはどうすればよいですか?

4

1 に答える 1

0

Parallel.For間違った使い方をしています。構成の予想される引数を読み取ると (書き込みParallel.For(、ポップアップを待つ)、2 番目の引数が であることがわかりますtoExclusive。したがって、エミュレートするには、次のFor item As Integer = 0 To tempTable.Rows.Count - 1ように記述する必要がありますParallel.For(0, tempTable.Rows.Count, Sub(item)。それを変更すると、コードは正常に動作するはずです。

- アップデート

提案された変換によってコードが正常に動作することを示す、追跡しやすい配列を含むコード サンプル。

Dim resultString As String = ""
Dim products(2) As Integer
products(0) = 1
products(1) = 2
For item As Integer = 0 To 1
    'main loop
    For cycleCount As Integer = 0 To 1
        'pagination loop

        For Each product As Integer In products
            'retrive products here
            resultString = resultString & "-" & product.ToString()
        Next
    Next
Next

Dim resultString2 As String = ""
Parallel.For(0, 2, Sub(item)
                       'main loop

                       For cycleCount As Integer = 0 To 1
                           'pagination loop

                           For Each product As Integer In products
                               'retrive products here 
                               resultString2 = resultString2 & "-" & product.ToString()
                           Next

                       Next

                   End Sub)

resultStringと の両方を比較しresultString2て、両方の変数がまったく同じ値を出力することを確認できるため、ループは正しく変換されます。

于 2013-08-06T10:15:50.287 に答える