Visual Basic 2013如何Ping ListBox中的所有IP

时间:2014-06-06 05:41:20

标签: wpf visual-studio-2012 listbox

您好,这是我第一次在这里发帖。在这一点上,我已拼凑在一起 一个能够加载文本文件的应用程序,即时添加到一个"列表框",现在我需要它来ping所有"列表框"但我得到一个错误,并停止工作。需要帮助ping所有ips。

Private Sub Go_Click(sender As Object, e As EventArgs) Handles Go.Click




    If ListBox1.Items.Count <= 0 Then
        MsgBox("Please Add at Least One IP or Website!")
        Exit Sub
    End If


    For l_index As Integer = 0 To ListBox1.Items.Count - 1        'THIS IS WHERE CODE STOPS WORKING, NEED "MAGIC CODE" HERE
        Dim lines As String = CStr(ListBox1.Items(l_index))
        BackgroundWorker1.RunWorkerAsync(lines)
    Next





End Sub

我正在使用Openfiledialog将文本文件加载到listbox1和backgroundworker来执行ping操作。我正在使用

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Threading
Imports System.IO

我想要做的就是所有&#34; IP&#34;在列表框中我想按Go去Ping所有Ips。我怎样才能让它发挥作用?

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Threading
Imports System.IO

Public Class Main


Private Sub AboutUpingToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AboutUpingToolStripMenuItem.Click
    AboutUping.Show()
End Sub

Private Sub MenuStrip1_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MainMenu.ItemClicked

End Sub

Private Sub QuitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles QuitToolStripMenuItem.Click
    Application.Exit()

End Sub

Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    Dim lines = File.ReadAllLines(OpenFileDialog1.FileName)

    ListBox1.Items.AddRange(lines)
End Sub

Private Sub OpenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem.Click
    OpenFileDialog1.ShowDialog()
End Sub

Private Sub NewToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NewToolStripMenuItem.Click
    Create.Show()
End Sub

Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem1.Click

End Sub

Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load



End Sub


Private Sub Go_Click(sender As Object, e As EventArgs) Handles Go.Click

    If ListBox1.Items.Count <= 0 Then
        MsgBox("Please Add at Least One IP or Website!")
        Exit Sub
    End If

    For l_index As Integer = 0 To ListBox1.Items.Count - 1        'THIS IS WHERE CODE STOPS WORKING, NEED "MAGIC CODE" HERE
        Dim lines As String = CStr(ListBox1.Items(l_index))
        BackgroundWorker1.RunWorkerAsync(lines)
    Next
End Sub

Private Sub CloseFileToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CloseFileToolStripMenuItem.Click
    TextBox1.Clear()
    ListBox1.Items.Clear()
End Sub

Private Sub cmdADD_Click(sender As Object, e As EventArgs) Handles cmdADD.Click
    Dim myitem
    myitem = txtADD.Text()
    ListBox1.Items.Add(myitem)
    txtADD.Clear()





End Sub

Private Sub cmdRemove_Click(sender As Object, e As EventArgs) Handles cmdRemove.Click
    For a As Int32 = ListBox1.SelectedItems.Count - 1 To 0 Step -1

        For i As Int32 = ListBox1.Items.Count - 1 To 0 Step -1

            '-- compare the value of the select item to any given item in the list.

            If ListBox1.SelectedItems(a) = ListBox1.Items(i) Then

                '-- remove the item by the index we found

                ListBox1.Items.RemoveAt(i)

                '-- exit the inner for loop

                Exit For

            End If

        Next

    Next
End Sub

Private Sub cmdClear_Click(sender As Object, e As EventArgs) Handles cmdClear.Click
    ListBox1.Items.Clear()
End Sub

Private Sub HelpToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HelpToolStripMenuItem.Click

End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim lines = DirectCast(e.Argument, String())
    Dim Ping As New Ping
    Dim replies As New List(Of PingReply)

    For Each ip In lines
        Dim reply = Ping.Send(ip)
        replies.Add(reply)
    Next

    e.Result = replies
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

    Dim sb As New System.Text.StringBuilder
    Dim replies = DirectCast(e.Result, List(Of PingReply))

    For Each reply In replies
        Dim index As Integer
        index += 1

        sb.Append("Ping ").Append(index).Append(": ").Append(reply.Address).Append("                   ").Append(reply.RoundtripTime).Append(" ms")
        sb.AppendLine()
    Next

    TextBox1.Text = sb.ToString

End Sub

End Class

2 个答案:

答案 0 :(得分:0)

您的错误在这里

你的一个ping失败并导致异常返回到已完成的事件处理程序,当处理程序尝试获取结果时抛出TargetInvocationException异常

解决方案是检查错误

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If e.Error Is Nothing Then
        Dim sb As New System.Text.StringBuilder
        Dim replies = DirectCast(e.Result, List(Of PingReply))

        For Each reply In replies
            Dim index As Integer
            index += 1

            sb.Append("Ping ").Append(index).Append(": ").Append(reply.Address).Append("                   ").Append(reply.RoundtripTime).Append(" ms")
            sb.AppendLine()
        Next

        TextBox1.Text = sb.ToString
    Else
        'error handling
    End If
End Sub

另外,您可能需要处理实际错误以保护其余的ping回复,否则因为1次失败将导致整批结果丢失

For Each ip As String In lines
    Try
        Dim reply As PingReply = Ping.Send(ip)
        replies.Add(reply)
    Catch ex as PingException
        'error handling
    End Try
Next

<强>更新

另一个错误点,

For l_index As Integer = 0 To ListBox1.Items.Count - 1        
    Dim lines As String = CStr(ListBox1.Items(l_index))
    BackgroundWorker1.RunWorkerAsync(lines)
Next

因为你从上面的方法和下面的方法中作为单个字符串传递,你试图转换为字符串数组,所以它失败了,改变它就像这样

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim ip = DirectCast(e.Argument, String)
    Dim Ping As New Ping
    Dim replies As New List(Of PingReply)

    Try
        Dim reply As PingReply = Ping.Send(ip)
        replies.Add(reply)
    Catch ex as PingException
        'error handling
    End Try
    e.Result = replies
End Sub

还建议使用Option Strict On来减少某些类型检查错误

答案 1 :(得分:0)

谢谢!得到它的工作!发送&#34; Listbox1&#34;数组

Private Sub Go_Click(sender As Object, e As EventArgs) Handles Go.Click

    Dim lines() As String = ListBox1.Items.OfType(Of String)().ToArray()

    BackgroundWorker1.RunWorkerAsync(lines)



End Sub

现在它可以运行应用程序不会崩溃。