gpt4 book ai didi

.net - 如果在 VB.NET 中超时,如何停止/加入线程

转载 作者:行者123 更新时间:2023-12-04 13:16:08 25 4
gpt4 key购买 nike

我正在编写将创建一系列线程的代码(例如:Function GetMACAddress(IPAddr as string) as string)。每个线程作业将花费不同的执行时间来处理(如果 IP 未被任何 PC 占用,则将花费更长的时间并且最后不会返回有效的 MAC 地址)。

我如何以这种方式管理和监控每个线程,以便在指定的超时期限(比如超时 = 100 毫秒)后仍未完成时我可以随时停止/中止?在我的例子中,我需要从 192.168.1.1 扫描到 192.168.1.255

我应该在这里使用哪种线程编码架构?

最佳答案

试试下面的代码

Imports System

Public Class TimedThread

Dim WithEvents Timer1 As Timers.Timer
Dim Thread1 As Threading.Thread

Dim Timeout1 As Integer

Sub New(ByVal Timeout1 As Integer, ByVal ThreadStart1 As Threading.ThreadStart)
Me.Timeout1 = Timeout1

If Timeout1 > 0 Then
Timer1 = New Timers.Timer(Timeout1)
End If

Thread1 = New Threading.Thread(ThreadStart1)
End Sub

Public Sub Start()
If Not Thread1 Is Nothing Then
Thread1.Start()
End If

If Timeout1 > 0 Then
Timer1.Enabled = True
End If
End Sub

Private Sub Timer1_Elapsed() Handles Timer1.Elapsed
If Thread1.ThreadState = Threading.ThreadState.Running Then
Thread1.Abort()
Timer1.Enabled = False

'Remove this line after testing
MsgBox("Thread aborted")
End If
End Sub

Public Sub Dispose()
If Not Timer1 Is Nothing Then
If Thread1.ThreadState = Threading.ThreadState.Running Then
Thread1.Abort()
End If

Timer1.Dispose()
End If
End Sub

End Class

要测试代码,请将这些行添加到您的表单中

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim Timeout1 As Integer = 1000
Dim TimedThread1 As New TimedThread(Timeout1, AddressOf TestSub)

TimedThread1.Start()
End Sub

Private Sub TestSub()
Dim i, a As Integer

For i = 0 To 1000000000
a += 1
Next

MsgBox("Operation complete")
End Sub

这个演示是针对单线程的。如果要使用多线程,请使用 TimedThread 类的数组。

例如,要将 IP 地址设置为输入参数并获取 MAC 地址作为返回值,您可以使用以下方法。

Public Structure NetInfo
Dim IP_Address As String
Dim MAC_Address As String

Sub New(ByVal IP_Address As String, ByVal MAC_Address As String)
Me.IP_Address = IP_Address
Me.MAC_Address = MAC_Address
End Sub
End Structure

Private Event ReturnValues(ByVal ReturnInfo1 As NetInfo)

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim Timeout1 As Integer = 0
Dim TimedThread1 As New TimedThread(Timeout1, Sub() GetMacAddress("192.168.0.1"))

TimedThread1.Start()
End Sub

Private Sub GetMacAddress(ByVal IP_Address1 As String)
'Processes for getting the MAC address based on the IP address.
'
'
Dim MAC_Address1 As String = "Test return value"
Dim ReturnInfo1 As New NetInfo(IP_Address1, MAC_Address1)

RaiseEvent ReturnValues(ReturnInfo1)
End Sub

Private Sub ThreadReturnValues(ByVal ReturnInfo1 As NetInfo) Handles Me.ReturnValues
MsgBox("IP = " & ReturnInfo1.IP_Address & " MAC = " & ReturnInfo1.MAC_Address)
End Sub

关于.net - 如果在 VB.NET 中超时,如何停止/加入线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17607625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com