How to stop/aboard threads if timeout in VB.NET

17,026

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
Share:
17,026
Dennis
Author by

Dennis

Updated on June 05, 2022

Comments

  • Dennis
    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
    Dennis almost 11 years
    how do I set input parameter and get the return value of the thread? for example input is "IP_Address", thread return "MAC_Address"