vb.net中止线程而不定义它

vb.net中止线程而不定义它,vb.net,multithreading,ping,abort,Vb.net,Multithreading,Ping,Abort,我正在开发一个ping程序,它有一系列的ping目标,每个目标生成自己的线程来ping,以避免减慢UI线程 当用户编辑ping目标的属性以更改ping之间的时间(频率)时,也就是线程睡眠的时间,使用更新的睡眠时间创建一个新线程,原始线程继续运行,结果是两个线程在不同的时间ping同一台计算机,这就是为什么我需要在使用更新的参数启动新线程之前结束原始线程 'Set up a class as a ping object, it will store information necessar

我正在开发一个ping程序,它有一系列的ping目标,每个目标生成自己的线程来ping,以避免减慢UI线程

当用户编辑ping目标的属性以更改ping之间的时间(频率)时,也就是线程睡眠的时间,使用更新的睡眠时间创建一个新线程,原始线程继续运行,结果是两个线程在不同的时间ping同一台计算机,这就是为什么我需要在使用更新的参数启动新线程之前结束原始线程

    'Set up a class as a ping object, it will store information necessary (not sure entirely how this works)
Class pingObj
    Property Name As String
    Property IP As String
    Property Frequency As String
    Property TimeOut As String
End Class

'Main ping sub, starts the threads to ping on!
Public Sub Ping(Name As String)

    Dim Parameters As New pingObj
    Parameters.Name = Name
    Parameters.IP = Targets(Name)(0)
    Parameters.Frequency = Targets(Name)(1)
    Parameters.TimeOut = Targets(Name)(2)


    Dim thread As New Threading.Thread(AddressOf PingThread)
    thread.IsBackground = True
    thread.Start(Parameters)

End Sub

'The thread itself, pings each system to determine if it is offline or online.
Public Sub PingThread(p As Object)
    Dim Parameters As pingObj = DirectCast(p, pingObj)

    'Do stuff
    Do

        If Targets.ContainsKey(Parameters.Name) Then

            'Lots of ping code'

            'Delay based on the frequency set.
            Dim TimeInMS As Integer = TimeSpan.Parse(Parameters.Frequency).TotalMilliseconds
            Threading.Thread.Sleep(TimeInMS)
        Else
            Exit Do
        End If

    Loop

End Sub
基本上,在上面,我用Ping(Name)启动一个线程,从我的字典中收集关于Ping目标的数据,并使用一个对象(pingobj)将该数据推送到PingThread()子目录中。当前,当目标从字典中删除时,“if targets.containskey(parameters.Name)”捕捉到它已经消失,并执行“退出”操作,使线程的功能停止足够长的时间,使其自动中止:

The thread '<No Name>' (0x2314) has exited with code 0 (0x0).
线程“”(0x2314)已退出,代码为0(0x0)。
但是,当用户编辑目标的属性并更改频率(线程睡眠的时间)时,我需要强制中止原始线程并使用新参数启动一个新线程,这样就不会有两个线程比用户定义的更频繁地ping同一目标

困难的部分是线程是在ping()子函数中动态创建的,并且线程没有存储在任何地方。所以我不能在需要时调用thread.abort(),我只能从线程的子线程()中中止线程

TL;DR:我需要一种方法来中止一个线程,该线程是动态创建的,没有存储,因为用户更改了线程的睡眠时间


还有,为什么我不能输入大写字母t?我必须复制粘贴一个才能使用它。

记录“动态”创建的内容。但是终止线程是个坏主意。我还能做什么?我需要线程停止ping以创建一个新的线程,当然vb.net的设计方式不会使结束线程变得非常困难和具有破坏性,这是非常必要的…使用标志并从线程检查它,中止一个线程可以在任何地方停止它,包括在ping代码的中间,可能使网络类处于无效状态。问题是使用.Sead。将其更改为Threading.AutoResetEvent.WaitOne(timespan),您可以通过设置将其唤醒。