2011-09-15 24 views
3

I持っているなど、いくつかのスレッドを作成するループ:複数のスレッドに複数のパラメータを渡す

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 

を:私の代わりに、手動でスレッドを作成するThreadPoolTask Parallel Libraryを使用して検討にもお勧めします。これは、一般に、ほとんどのシナリオではより良いアプローチです。

関連する問題