Member 11856456 Ответов: 0

Как я могу использовать либо theading бассейн или потоки, на каждой итерации оператора for


попробовав parallel fors и parallel foreach, я обнаружил, что лично в моем случае, поскольку они асинхронны, они не работают для процесса, который я пытаюсь выполнить. Я читал о потоках и пулах потоков и подумал, что это может быть лучшим подходом к тому, что я пытаюсь сделать.

Я сделал заявление о совпадении, которое сравнивает 2 таблицы и ищет точные совпадения.

For i = 0 To temptable.Rows.Count - 1


            For I2 = I3 To dt.Rows.Count - 1

                counti2 = counti2 + 1

                Call match_specifications(i, I2, I3, dt, count, Duplicatestart, nxrecord, matchedmiddlename, newindividual.Middle_name)

                If nxrecord = True Then
                    nxrecord = False
                    GoTo nextrecord
                ElseIf nxI = True Then
                    nxI = False
                    GoTo nxI

                Else

                End If

nxI2:

            Next I2

If count >= 1 Then
                I3 = Duplicatestart + count
            Else
                I3 = I2 + 1
            End If

            count = 0
            deathcount = 0
            Referencecount = 0
            updatecount = 0
            Duplicatestart = Nothing
Next I


чтобы этот код работал должным образом, таблицы должны быть расположены в алфавитном порядке.

Проблема в том, что I2 является держателем места последнего известного матча, поэтому, если последний матч начинается, например, с y, он начинается там. из-за этой функциональности я не могу иметь асинхронный итератор, они всегда должны быть последовательными.

То, что я хотел бы сделать, - это сделать так, чтобы каждый поток был своей собственной итерацией, а затем объединиться вместе.

например, поток 1 будет I = 0, поток 2 будет I=1, поток 3 будет I = 2...и т. д

моя философия состояла в том, чтобы рассматривать каждую нить как свой собственный процесс одной и той же процедуры.

Dim x As Long
       Dim y As Long
       Dim newx As Long

       x = temptable.Rows.Count / Environment.ProcessorCount
       x = Math.Ceiling(x)

       For total = 0 To Environment.ProcessorCount - 1
           I = x * total
           newx = x * (total + 1)
           Dim t As New Thread(Sub() Match_Merge(I, newx))
           threads.Add(t)
           t.Start()
       Next

       For Each t As Thread In threads
           t.Join()
       Next


Проблема, с которой я столкнулся, была либо "ошибкой коррупции 4", либо она будет завершена, но результаты были неправильными.

есть ли способ изолировать I2 от протектора, на котором он находится? Если я смогу получить эту тему конкретной, это может прояснить проблемы, которые у меня возникли.

Таким образом, если поток 1 находится на i2 = 3, а поток 2 идет и находится на i2 = 100, то I2 на потоке 1 1 все равно будет i2 = 3 до его следующей итерации. Я хочу, чтобы i2 был независим от каждого потока.

Что я уже пробовал:

Я попытался использовать synclock и переместил свой sql-оператор так, чтобы он не вызывался каждый раз. Я также попытался разделить информацию равномерно, используя функцию math.ceiling round, но все равно получал ошибки.

Gerry Schmitz

Это бессмысленное занятие. Добавлена сложность для получения того же результата, что и "синхронное" совпадение / не в / перекрывающемся запросе SQL / LINQ sets.

Maciej Los

Извините, но я думаю, что вы пытаетесь повернуть колесо вспять... это означает, что вам не нужны отдельные процессы, чтобы иметь возможность сравнивать строки данных. На данный момент вы не предоставили достаточно информации о методе сравнения (match_specification) и о том, чего вы хотите достичь (ожидаемый результат).
Можете ли вы поделиться образцами данных и ожидаемым результатом?

0 Ответов