In einem Programm sollen mehrere IP-Adressen angepingt werden, was ja ziemlich dauern kann, wenn die IPs offline sind. Also versuche ich eine asynchrone Ausführung mit Delegaten.
[highlight=vbnet]
Public Delegate Sub AskPing(ByVal IPAdresse As String, ByVal info As InfoDelegate)
Public Delegate Sub InfoDelegate(ByVal IPAdresse As String, ByVal Antwort1 As String, ByVal Antwort2 As String)
Public Class IPScanner
Sub Main
For i = 0 to 255
IPAdresse = AufbauIPadresse(i)
j += 1
ScanAsk(IPAdresse, j)
If j = 10 Then j = 0
Next
End Sub
End Class[/highlight]
Aufgerufen wird dann:
[highlight=vbnet] Private Sub ScanAsk(ByVal IPAdresse As String, ByVal Lauf As Integer)
Dim IPz As New IPZeugs
Select Case Lauf
Case 1
Dim dgAntwort1 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo1 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort1.Invoke(IPAdresse, dgInfo1)
Case 2
Dim dgAntwort2 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo2 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort2.Invoke(IPAdresse, dgInfo2)
'[...]
Case 10
Dim dgAntwort10 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo10 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort10.Invoke(IPAdresse, dgInfo10)
End Select
End Sub
Public Shared Sub ScanAnswer(ByVal IPAdresse As String, ByVal Antwort1 As String, ByVal Antwort2 As String)
IPScanner.ListBoxIP.Items.Add(IPAdresse & " - " & Antwort1 & " - " & Antwort2)
IPScanner.ListBoxIP.SelectedIndex = IPScanner.ListBoxIP.Items.Count - 1
End Sub[/highlight]
Dann gibt es noch die kleine Klasse IPZeugs
[highlight=vbnet]Public Class IPZeugs
Public Sub Anpingen(ByVal IPAdresse As String, ByVal info As InfoDelegate)
Dim x As System.Net.IPHostEntry
Dim siteResponds = My.Computer.Network.Ping(IPAdresse)
Dim Antwort1 As String
Dim Antwort2 As String
If siteResponds Then
Antwort1 = "online"
Else
Antwort1 = "offline"
End If
Antwort2 = ""
Try
x = System.Net.Dns.GetHostEntry(IPAdresse)
Antwort2 = x.HostName
Catch ex As Exception
End Try
info.Invoke(IPAdresse, Antwort1, Antwort2)
End Sub
End Class[/highlight]
Dummerweise wartet das Programm aber bei jedem Aufruf dann doch auf das Pingergebnis, anstatt einfach weiterzulaufen und die nächste IP zu nehmen. Was mache ich falsch???
[highlight=vbnet]
Public Delegate Sub AskPing(ByVal IPAdresse As String, ByVal info As InfoDelegate)
Public Delegate Sub InfoDelegate(ByVal IPAdresse As String, ByVal Antwort1 As String, ByVal Antwort2 As String)
Public Class IPScanner
Sub Main
For i = 0 to 255
IPAdresse = AufbauIPadresse(i)
j += 1
ScanAsk(IPAdresse, j)
If j = 10 Then j = 0
Next
End Sub
End Class[/highlight]
Aufgerufen wird dann:
[highlight=vbnet] Private Sub ScanAsk(ByVal IPAdresse As String, ByVal Lauf As Integer)
Dim IPz As New IPZeugs
Select Case Lauf
Case 1
Dim dgAntwort1 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo1 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort1.Invoke(IPAdresse, dgInfo1)
Case 2
Dim dgAntwort2 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo2 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort2.Invoke(IPAdresse, dgInfo2)
'[...]
Case 10
Dim dgAntwort10 As New AskPing(AddressOf IPz.Anpingen)
Dim dgInfo10 As New InfoDelegate(AddressOf ScanAnswer)
dgAntwort10.Invoke(IPAdresse, dgInfo10)
End Select
End Sub
Public Shared Sub ScanAnswer(ByVal IPAdresse As String, ByVal Antwort1 As String, ByVal Antwort2 As String)
IPScanner.ListBoxIP.Items.Add(IPAdresse & " - " & Antwort1 & " - " & Antwort2)
IPScanner.ListBoxIP.SelectedIndex = IPScanner.ListBoxIP.Items.Count - 1
End Sub[/highlight]
Dann gibt es noch die kleine Klasse IPZeugs
[highlight=vbnet]Public Class IPZeugs
Public Sub Anpingen(ByVal IPAdresse As String, ByVal info As InfoDelegate)
Dim x As System.Net.IPHostEntry
Dim siteResponds = My.Computer.Network.Ping(IPAdresse)
Dim Antwort1 As String
Dim Antwort2 As String
If siteResponds Then
Antwort1 = "online"
Else
Antwort1 = "offline"
End If
Antwort2 = ""
Try
x = System.Net.Dns.GetHostEntry(IPAdresse)
Antwort2 = x.HostName
Catch ex As Exception
End Try
info.Invoke(IPAdresse, Antwort1, Antwort2)
End Sub
End Class[/highlight]
Dummerweise wartet das Programm aber bei jedem Aufruf dann doch auf das Pingergebnis, anstatt einfach weiterzulaufen und die nächste IP zu nehmen. Was mache ich falsch???
Comment