2013-08-06 6 views
0

У меня есть программа, которая извлекает данные с веб-сайта, то есть 1-го получает категории и подкатегории и сохраняет их в таблице категорий. Затем отображает соответствующий 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). Если вы измените это, ваш код должен работать нормально.

- ОБНОВЛЕНИЕ

Пример кода с простым чтобы быть отслеживаемых массивы, показывающие, что предлагаемое преобразование позволяет ваш код работать нормально.

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 и убедитесь, что обе выходные переменные точно так же значение, таким образом, цикл справедливо преобразуется.

+0

Он по-прежнему падает. Я просматривал, и я обнаружил, что, когда один и тот же фрагмент кода выполняется параллельно, имеет одно и то же имя переменной, что приводит к дублированию записей. – user1844205

+0

Поэтому мне нужен способ синхронизации моего кода. Я попытался использовать SyncLock, но потребовалось то же самое время, чтобы выполнить, как код без потоковой передачи :-) – user1844205

+0

@ user1844205 Я выполняю этот кусок кода, заменяя ваши массивы, и он отлично работает. Я обновляю свой ответ с помощью простого кода для проверки, чтобы вы лучше поняли, где может быть проблема (в любом случае это данные, а не в цикле). – varocarbas

Смежные вопросы