How to stop/aboard threads if timeout in VB.NET
Try the following code
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
to test the code, add these lines inside your form
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
This demonstration is for a single thread. If you want to use multiple threads, use an array of the TimedThread Class.
To set for example an IP address as a input parameter and get the MAC address as a return value, you can use the following approach.
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
Dennis
Updated on June 05, 2022Comments
-
Dennis almost 2 years
I am working on a code which will create a series threads (e.g:
Function GetMACAddress(IPAddr as string) as string
). Each thread job will take different execution time to process (will take way longer if IP not occupied by any PC & no valid MAC Address will be return at the end).How can I manage & monitor each thread in such a way so that I can stop/abort at anytime if it still yet to be completed after a specified timeout period (say Timeout = 100ms)? In my case I'll need to scan from 192.168.1.1 to 192.168.1.255
What sort of threading coding architecture I should using here?
-
Dennis almost 11 yearshow do I set input parameter and get the return value of the thread? for example input is "IP_Address", thread return "MAC_Address"