2013-08-06 53 views
0

我有一個程序,它從網站檢索數據,即第一個它獲取類別和子類別並將其存儲在類別表中。 然後點擊相應的類別URL並檢索產品。在循環中使用多線程

我有一個外部循環遍歷類別URL 和一個內部循環來處理分頁 和一個內部循環來檢索產品。

這裏是我的代碼

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(任務並行庫)。

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記錄被插入,但有重複的項目,之後代碼崩潰此錯誤傳來:「一個或多個錯誤發生」

所以,我如何在我的代碼中實現多線程?

+0

您需要發表更多的代碼。您發佈的代碼並未顯示每個循環級別之間的關係,也沒有顯示多線程將提升性能的昂貴操作的位置。 – Enigmativity

回答

0

您錯誤地使用了Parallel.For。如果您閱讀了您的配置的預期參數(編寫Parallel.For(並等待彈出窗口),您會看到第二個參數是toExclusive。因此,要效仿For item As Integer = 0 To tempTable.Rows.Count - 1,您必須編寫Parallel.For(0, tempTable.Rows.Count, Sub(item)。如果你改變了,你的代碼應該可以正常工作。

- UPDATE

與容易被追蹤的陣列顯示代碼示例,所提出的轉換可以讓你的代碼工作正常。

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) 

您可以比較這兩個resultStringresultString2,並確認這兩個變量輸出完全一樣的值,所以環形是正確轉換。

+0

它仍然崩潰。 我已經搜遍了,並且我發現當同一段代碼並行執行時,它們具有相同的變量名,從而導致記錄的重複。 – user1844205

+0

因此,我需要一種方法來同步我的代碼。我試圖使用SyncLock,但它需要同樣的時間才能執行像沒有線程代碼:-) – user1844205

+0

@ user1844205我正在執行這段代碼通過替換您的數組,它完美的作品。我會用一個簡單的代碼更新我的答案,以便您進行測試,以便您更好地瞭解問題的出現位置(無論如何,它都位於數據中,而不是循環中)。 – varocarbas