我正在尝试开始一些线程并且无法解释我所看到的内容:
应用的迷你版:
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
我发生了什么事?
答案 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