VB 中的参数线程



首先,我对 vb 中的线程没有很好的了解,我试图获取有关它的信息,但我仍然对它的工作原理、地址、正确的实现等感到困惑。我想问一下如何使用参数创建一个新线程,以便从主线程传递一个值。 我尝试做一个循环,每个循环创建一个新线程并执行ping。下面是我的代码:

For i = 10 To 50
Dim worker As New Thread(New ThreadStart(Function()
My.Computer.Network.Ping("192.168.1." & i)
Console.WriteLine("192.168.1." & i)
End Function))
worker.Start()
Next

我意识到这是错误的,因为结果将循环并 ping 变量 i 的最后一个值。所以我想问一下关于它的正确建议。如果您为我添加一个简单的解释,以便更好地了解线程,我将不胜感激。

提前谢谢你

你的代码几乎是正确的。但是,由于您对所有创建的线程使用相同的变量。因此,当您的线程启动时,它或多或少包含指向 i 的指针,而不是 i 的值。这意味着随着循环的进展,i 的值会发生变化。因此,当您的线程实际开始工作时,循环已经完成,i 的值已更改为 51。

要解决此问题,您必须在循环内创建一个新整数。因此,提供的对象对于每个循环都是唯一的。这样:

Dim x as Integer = i

然后向线程提供 x 而不是 i,一切就绪。

以下是有关该主题的一些阅读: https://devblogs.microsoft.com/vbteam/closures-in-vb-part-5-looping/

您可能还想尝试 async/await 作为更好的选择。

请确保使用async关键字使调用方异步方法:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
For i As Integer = 1 To 5
Dim ip As String = $"192.168.1.{i}"
Await Task.Run(Sub() Pinger(ip))
Next
End Sub
Private Sub Pinger(ip As String)
If My.Computer.Network.Ping(ip) Then
Console.WriteLine($"{ip} is alive.")
Else
Console.WriteLine($"{ip} is dead.")
End If
End Sub

输出:

192.168.1.1 is alive.
192.168.1.2 is dead.
192.168.1.3 is dead.
192.168.1.4 is dead.
192.168.1.5 is alive.

为什么你会得到一个有序的序列?我引用:

该方法通常至少包含一个 await 表达式,该表达式标记 方法在等待的异步之前无法继续的点 操作完成。

有关更多有用的详细信息,请参阅上面给定的链接。

最新更新