VB.NET从for循环启动线程"错误"传入的价值观

时间:2014-08-28 18:43:39

标签: vb.net multithreading visual-studio-2010

我正在尝试开始一些线程并且无法解释我所看到的内容:

应用的迷你版:

Imports System.Threading

Module Module1

Sub Main()
    Dim i As Integer
    Dim theThread(3) As Thread

    For i = 0 To theThread.Length - 1

        theThread(i) = New Thread(AddressOf runme)
        theThread(i).Start(i)
        '^^^ version a above and b below
        'theThread(i) = New Thread(Sub() runme(i))
        'theThread(i).Start()

    Next

    Thread.Sleep(10000)

End Sub


Sub runme(i As Integer)
    Console.WriteLine("i= " & i & " - System Thread: " &Thread.CurrentThread.ManagedThreadId)
    Thread.Sleep(2000)

End Sub

End Module

当我运行它时,它可以工作 - 我输出如下:
i = 3 - 系统线程:13
i = 0 - 系统线程:10
i = 2 - 系统线程:12
i = 1 - 系统线程:11

这是我的期望。如果我将新线程代码切换到版本" b" (这是我继承的),我输出如下:
i = 2 - 系统线程:10
i = 2 - 系统线程:11
i = 3 - 系统线程:12
i = 4 - 系统线程:13

我发生了什么事?

1 个答案:

答案 0 :(得分:0)

我的猜测是"版本b"您正在创建一个新的Sub,然后运行嵌套的Sub。很可能主线程已经进展到i的下一次迭代,现在线程以i = 2开始。这就是为什么你得到两个线程报告i为2的原因。测试它的一种方法是在Next语句之前添加一个Sleep语句。

For i = 0 To theThread.Length - 1

    theThread(i) = New Thread(Sub() runme(i))
    theThread(i).Start()

    Thread.Sleep(250)

Next