0

我正在开发一个 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)”会捕捉到它已经消失并执行“Exit Do”,这会停止线程的功能足够长的时间以使其自动中止:

The thread '<No Name>' (0x2314) has exited with code 0 (0x0).

但是,当用户编辑目标的属性并更改频率(线程休眠多长时间)时,我需要强制中止原始线程并使用新参数启动一个新线程,这样我就没有两个线程 ping 同一个目标的频率高于用户定义的频率。

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

TL;DR:我需要一种方法来中止动态创建的线程,而不是存储的线程,因为用户更改了线程休眠的时间。

PS 为什么我不能输入大写的 t?我必须复制粘贴一个才能使用它。

4

0 回答 0