2011-09-15 162 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

這是由於lambda關閉了錯誤範圍內的變量。 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而不是手動創建線程的考慮。總的來說,這對大多數情況來說都是更好的方法。