Du musst im DoWork-Sub die e.Cancel-Property abfragen und ggf. aussteigen.
Private mPing As String = String.Empty
Private Sub TextBox1_TextChanged(sender As System.Object, e As _
System.EventArgs) Handles TextBox1.TextChanged
mPing = CType(sender, TextBox).Text
End Sub
Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As _
System.EventArgs) Handles CheckBox1.CheckedChanged
Dim chkd = CType(sender, CheckBox).Checked
If Not mBGW.IsBusy And chkd Then
mBGW.RunWorkerAsync()
ElseIf mBGW.IsBusy And Not chkd Then
mBGW.CancelAsync()
End If
End Sub
Private WithEvents mBGW As New System.ComponentModel.BackgroundWorker With _
{.WorkerSupportsCancellation = True}
Private Sub BackgroundWorker1_DoWork1(ByVal sender As Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs) Handles mBGW.DoWork
Do Until e.Cancel
Dim result As Boolean = My.Computer.Network.Ping(mPing)
Debug.WriteLine(String.Format("{0}: {1} - {2}", Date.Now, mPing, _
result))
System.Threading.Thread.Sleep(1000 * 3)
Loop
End SubIn deinem Fall bietet sich aber auch der asynchrone System.Timers.Timer an (der System.Windows.Forms.Timer ist nicht asynchron):
Private WithEvents mTimer As New Timers.Timer With {.Interval = 3000}
Private Delegate Sub AddToTextBoxDelegate(txt As String)
Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As _
System.EventArgs) Handles CheckBox1.CheckedChanged
Dim chkd As Boolean = CType(sender, CheckBox).Checked
mTimer.Enabled = chkd
End Sub
Private Sub mTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) _
Handles mTimer.Elapsed
If My.Computer.Network.Ping(mPing) Then
Me.AddToTextBox(Date.Now & " Die IP Adresse: " & mPing & " war" & _
"verfügbar")
Else
Me.AddToTextBox(Date.Now & " Die IP Adresse: " & mPing & " war" & _
"nicht verfügbar")
End If
End Sub
Private Sub AddToTextBox(txt As String)
If Me.InvokeRequired Then
Me.Invoke(New AddToTextBoxDelegate(AddressOf Me.AddToTextBox), txt)
Else
Me.TextBox2.Text &= txt & vbCrLf
End If
End SubWenn du asynchron auf Controls zugreifen willst (hier eine TextBox anstatt deiner LogFile), musst du .Invoke von irgendeinem Control benutzen. Mit .InvokeRequired kannst du prüfen, ob ein .Invoke notwendig ist. Ich habe hier als Control die Form genutzt, aber es geht auch jedes andere Control. Das macht keinen Unterschied.
Bei beiden Möglichkeiten gibt es ein unterschiedliches Verhalten, beim Abbrechen und Starten innerhalb der Rundenzeit. Der Timer würde sofort wieder starten. Der BGW würde einfach weiterlaufen, also die Restzeit noch warten. Den BGW interessiert es somit nicht ob du kurz auf Cancel und dann gleich wieder auf Start klickst, also Off/On in z.B. einer Sekunde.
Maas |