'
' Name:
'
' BGPing
'
' Description:
'
' Sample code for starting and stopping a background thread. Also shows how
' to update foreground controls from background threads using delegates.
'
' Audit:
'
' 2012-11-18 Reverend Jim - original code
'
Public Class Form1
'Background threads cannot write to controls in other threads. In order to
'update the status label you have to access it through a delegate. You'll
'see how this works in the UpdateStatus Sub.
Private Delegate Sub dlgUpdateStatus(text As String)
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
'If the background thread is active, kill it. We already have the code
'in the button click handler so let's just use that.
If btnStart.Text = "Stop" Then
btnStart.PerformClick()
End If
End Sub
Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
'We'll start and stop the background worker using one button. We'll
'toggle the button text as we change states between running to stopped.
Dim btn As Button = sender
If btn.Text = "Start" Then 'start the background thread
btn.Text = "Stop"
bgwPing.RunWorkerAsync()
Else
btn.Text = "Start"
bgwPing.CancelAsync() 'tell the background thread to stop itself
End If
End Sub
Private Sub UpdateStatus(text As String)
'The InvokeRequired method returns True if the thread that calls it
'is running from a different thread. In that case we create a delegate
'to do the update of the control's text otherwise we can update the
'text directly.
If lblStatus.InvokeRequired Then
Dim dlg As New dlgUpdateStatus(AddressOf UpdateStatus)
Me.Invoke(dlg, text)
Else
lblStatus.Text = TimeOfDay & " " & txtAddress.Text & " is " & text
End If
End Sub
Private Sub bgwPing_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwPing.DoWork
Do
'If the foreground thread requested a cancellation then set the
'appropriate flag and exit the loop.
If bgwPing.CancellationPending Then
e.Cancel = True
Exit Do
End If
'do the ping and update the status label
If My.Computer.Network.Ping(txtAddress.Text) Then
UpdateStatus("Responding")
Else
UpdateStatus("Not Responding")
End If
'suspend for five seconds before the next ping
System.Threading.Thread.Sleep(5000)
Loop
End Sub
End Class