Впервые отправив вопрос здесь. Извините, если название требует работы. :)
Рассмотрим следующий код (не оригинальный код, а упрощенная версия):
Imports System.Threading.Tasks
Module Module1
Sub Main()
' just a sample array to loop in parallel.forEach.
' the sample parallel loop does not consume for this demonstration.
Dim things() As String = {"thing1", "thing2"}
Dim parallelLoopBody = Sub(s As String)
For i As Integer = 1 To 10
Dim j As Integer
For k As Integer = 1 To 10
j += (k * i)
Next
Console.WriteLine(j)
Next
End Sub
' when debugging the original code I set max 1 for easier debugging purposes
Dim po As New ParallelOptions With {.MaxDegreeOfParallelism = 1}
Parallel.ForEach(things, po, parallelLoopBody)
End Sub
End Module
Это должно привести к следующему выводу, как написано выше:
55
165
330
550
825
1155
1540
1980
2475
3025
55
165
330
550
825
1155
1540
1980
2475
3025
Но при явном объявлении j = 0
и выполнении кода
55
110
165
220
275
330
385
440
495
550
55
110
165
220
275
330
385
440
495
550
Когда я прошел по коду, я понял, что переменная j
«хранит» значение из последней итерации цикла.
Но я бы ожидал, что j
будет каждый раз 0, потому что это тип значения, и я объявляю его в теле цикла.
Я смог получить ожидаемые результаты, явно установив j
в 0.
Может кто-нибудь объяснить, почему это происходит?