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