Vb.net vb中的参数线程

Vb.net vb中的参数线程,vb.net,multithreading,Vb.net,Multithreading,首先,我对vb中的线程没有很好的理解,我试图获取有关它的信息,但我仍然对它的工作原理、addressof、正确的实现等感到困惑。我想询问如何使用参数创建一个新线程,以便从主线程传递一个值。 我尝试做一个循环,每个循环创建一个新线程并执行ping。下面是我的代码: For i = 10 To 50 Dim worker As New Thread(New ThreadStart(Function()

首先,我对vb中的线程没有很好的理解,我试图获取有关它的信息,但我仍然对它的工作原理、addressof、正确的实现等感到困惑。我想询问如何使用参数创建一个新线程,以便从主线程传递一个值。 我尝试做一个循环,每个循环创建一个新线程并执行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,您就都设置好了

以下是一些关于该主题的阅读:

您也可以尝试作为更好的选择

示例

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

Private Async Sub Button1\u单击(发送方作为对象,e作为事件参数)处理按钮1。单击
对于i,作为整数=1到5
Dim ip As String=$“192.168.1.{i}”
等待任务。运行(Sub()Pinger(ip))
下一个
端接头
专用子Pinger(ip作为字符串)
如果我的.Computer.Network.Ping(ip)那么
Console.WriteLine($“{ip}处于活动状态。”)
其他的
WriteLine($“{ip}已死亡。”)
如果结束
端接头
输出:

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.
为什么会得到一个有序的序列?我引述:

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


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

这一行确实解决了这个问题。我测试了3次,结果很好。只是对结果有点好奇(请考虑这不是下一个问题)。创建的线程实际上不是按顺序排列的。比如:Ping 192.168.1.10 Ping 192.168.1.11 Ping 192.168.1.13 Ping 192.168.1.12 Ping 192.168.1.15 Ping 192.168.1.14 Ping 192.168.1.20。然而,结果是正确的。没有跳过任何ip。非常感谢@WozzeCYou正在运行线程,因此线程会尽快打印输出。这意味着一旦Ping完成,它就会打印出来。因此,如果.10需要20毫秒才能ping,.11需要15毫秒才能ping,那么.11将在.10之前打印。如果你想让他们井然有序,你应该看看另一个答案@土康果酱。另外,不要忘记将答案标记为正确。谢谢@JQSOFT的回答和解释。这对于我的脚本的另一部分也是一个很好的解决方案,而基于
任务
的工作可以推到后台线程上,
等待
ed、
异步
等待
实际上与线程有点正交。并不是所有得到
wait
ed的东西都会在线程中结束。我认为在这种情况下,将重点放在面向
任务的部分更合适。我强烈建议您阅读斯蒂芬·克利里关于这个主题的各种博客文章。@Craig感谢您的宝贵评论。如果你能在一篇文章中用这里的简单例子来翻译,那就太好了。我知道我们有一个公认的答案,但是,有不同的解决方案/意见/更正将使这篇文章更有用,更不用说,我们也是来学习的。@JQSOFT也可以。