【问题标题】:Using multithreading in loops在循环中使用多线程
【发布时间】:2013-08-06 18:58:07
【问题描述】:

我有一个程序,它从网站检索数据,即首先它获取类别和子类别并将其存储在类别表中。 然后点击相应的类别 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 条记录,但有重复的项目,然后代码崩溃了这个错误:'一个或多个错误发生'

那么,如何在我的代码中实现多线程?

【问题讨论】:

  • 您需要发布更多代码。您发布的代码没有显示每个循环级别之间的关系,也没有任何迹象表明多线程会提高性能的代价高昂的操作在哪里。

标签: vb.net multithreading task-parallel-library


【解决方案1】:

您错误地使用了Parallel.For。如果您阅读了配置的预期参数(写入Parallel.For( 并等待弹出窗口),您会看到第二个参数是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)

您可以比较resultStringresultString2 并确认两个变量输出完全相同的值,从而正确转换循环。

【讨论】:

  • 它仍然崩溃。我搜索了一下,发现当并行执行同一段代码时,变量名相同,从而导致记录重复。
  • 因此,我需要一种方法来同步我的代码。我尝试使用 SyncLock,但它像没有线程的代码一样执行需要相同的时间:-)
  • @user1844205 我正在通过替换你的数组来执行这段代码,它运行良好。我将用一个简单的代码更新我的答案,以便您进行测试,以便您更好地了解问题可能出在哪里(无论如何,它在数据中,而不是在循环中)。
  • @user1844205 我已经更新了我的答案。请确认从正常循环到并行循环的转换已完成,并开始在其他地方寻找您的问题(数组中的维度/值)。
  • 您能否在大范围内运行您的代码并尝试声明更多变量并在最内部的循环中使用它们?因为我在最里面的循环中有大约 7-8 个变量,我的循环运行了大约 300 次。
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多