2011-09-15 107 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而不是手动创建线程的考虑。总的来说,这对大多数情况来说都是更好的方法。