2011-09-15 4 views
3

나는이 같은 여러 개의 스레드를 생성하는 루프 :여러 스레드에 여러 매개 변수를 전달

이제
SomeClass.. 

Dim someNumber As Integer = 0 
Dim somethingElse As Integer = 10 
Dim myThread(500) As System.Threading.Thread 

For i As Integer = 0 To 500 
    someNumber += 1 
    somethingElse += 10 

    myThread(i) = New Thread(Sub() myThreadFunction(someNumber, somethingElse)) 
    myThread(i).Start() 
Next 

For j As Integer = 0 To 500 
    myThread(j).Join() 
Next 

Sub myThreadFunction(ByVal someNumber As Integer, ByRef somethingElse As Integer) 

    DoStuff 

End Sub 

내 문제 가끔 통과해야하는데 myThreadFunction, 보통 값으로 전달 된 잘못된 값을 얻을 수 있다는 것입니다 루프의 다음 반복에서.

내가 잘못하고 있는데, 더 좋은 방법이 있습니까?

답변

4

이것은 잘못된 범위에서 변수를 덮는 람다 때문에 발생합니다. Eric Lippert는이 문제를 Closing over the loop variable considered harmful에 자세히 설명합니다.

For i As Integer = 0 To 500 
    someNumber += 1 
    somethingElse += 10 

    ' Make some locally scoped variables 
    Dim temp1 As Integer = someNumber 
    Dim temp2 As Integer = somethingElse 

    ' Use the temporaries 
    myThread(i) = New Thread(Sub() myThreadFunction(temp1, temp2)) 
    myThread(i).Start() 
Next 

을 별도의 메모에서 :

당신은 적절한 범위에서 임시 변수를 도입 할 필요가,이 일을하려면 내가 수동으로 작성하는 스레드 대신 ThreadPool 또는 Task Parallel Library 사용을 고려 또한 추천 할 것입니다. 이것은 일반적으로 대부분의 시나리오에서 더 나은 접근 방법입니다.

관련 문제