2013-06-11 101 views
0

下午所有,我可以按特定順序查看網站列表嗎?

我在編寫我的第一個控制檯應用程序在VB中的過程。我正在開發的應用程序基本上是一個網站列表,然後寫出狀態。

我的問題是下面...

有我命令,我希望在我的VB來ping網站的方式。目前,我只是列出了這一點,並不重要的是,我在ping命令中寫入這些網站的順序似乎拉回了寫出最快repsonce的狀態。麻煩的是,我有幾個站點位於同一個Web框中,狀態消息在寫出狀態時似乎很糟糕。我認爲這是因爲他們有相同的響應時間。

請找我一直在使用的代碼...

'Imports ping class 
Imports System.Net.NetworkInformation 

Module Module1 

Sub Main() 

    Console.Title = ("Daily Checks PING to Check Current Status") 
    Dim myPingList As New List(Of String) 'A LIST TO HOLD SOME STRINGS 
    Dim myPing As Ping = Nothing   'PING CLASS 
    Dim timeout As Integer = 100000   'TIMEOUT FOR PING REQUESTS 


    'ADD A BUNCH OF THINGS TO PING 
    myPingList.Add("website1") 
    myPingList.Add("website3") 
    myPingList.Add("website2") 


    'LOOP THE STRING LIST OF PLACES WE WANT TO PING 
    For Each ItemToPing As String In myPingList 

     'CREATE A NEW PING OBJECT 
     myPing = New Ping 

     'ADD EVENT HANDLER FOR THE PING COMPLETED EVENT 
     'PingResult IS THE SUB ROUTINE BELOW 
     AddHandler myPing.PingCompleted, _ 
        AddressOf PingResult 

     'TELL USER WHAT IS BEING PINGED 
     'Console.WriteLine("Sending PING Request To: " & ItemToPing) 

     'SEND ASYNC PING REQUEST 
     'myPing.SendAsync(ItemToPing, timeout, Buffer, ItemToPing) 
     myPing.SendAsync(ItemToPing, timeout, ItemToPing) 
    Next 

    'WAIT FOR A KEYPRESS TO CLOSE CONSOLE WINDOW 
    Console.WriteLine("") 
    Console.WriteLine("Critical Systems Ping Results:") 
    Console.ReadKey(True) 

End Sub 

'THE PING RESULT THAT WILL FIRE WHEN A PING COMPLETES 
Private Sub PingResult(ByVal sender As Object, ByVal e As System.Net.NetworkInformation.PingCompletedEventArgs) 

    'OUTPUT TO USER, e.UserState IS WHAT WE PASSED IN AS THE UserToken (ItemToPing) IN THE ABOVE CODE 
    Console.WriteLine("") 
    Console.WriteLine("***********************************") 
    Console.WriteLine("Application: " & e.UserState.ToString) 

    ''IF THERE WAS AN ERROR THEN OUTPUT INFORMATION ABOUT THE ERROR 
    ''OTHERWISE OUTPUT INFORMATION ABOUT THE RESULT OF THE PING REQUEST 
    ''THE EVENTARGS e HAVE A LOT OF INFORMATION IN THE e.Reply VARIABLE 
    If e.Error IsNot Nothing Then 
     Console.WriteLine("Error: " & e.Error.Message) 
     If e.Error.InnerException IsNot Nothing Then 
      Console.WriteLine("More Info: " & e.Error.InnerException.Message) 
     End If 
    Else 
     Console.WriteLine("Status: " & e.Reply.Status.ToString) 
     Console.WriteLine("Round Trip Time: " & e.Reply.RoundtripTime.ToString) 
     Console.WriteLine("Response Buffer Length:" & e.Reply.Buffer.Length.ToString) 
    End If 
    Console.WriteLine("***********************************") 


    'THE SENDER IN THE ARGUMENTS IS THE PING OBJECT THAT WE CREATED 
    'SO NOW REMOVE THE EVENT HANDLER LISTENER AS IT IS NO LONGER NEEDED 
    'AND CALL Dispose() ON THE PING CLASS TO CLEAN UP UNMANAGED RESOURCES 
    With DirectCast(sender, Ping) 
     RemoveHandler .PingCompleted, AddressOf PingResult 
     .Dispose() 
    End With 

End Sub 

End Module 

有probaby一種更好的方式來完成/寫這個任務,但上面是一個開始。 任何幫助,非常感謝。

Registers Betty。

回答

0

據我看到它,你有兩個選擇:

  1. 緩衝效果。收集所有結果,完成後只顯示它們。這可能是兩種選擇中最快的執行方式,但可能會延遲顯示結果。
  2. 排隊等待一個完成,然後開始下一個。

您使用SendAsync這意味着,很好,這是異步設計。這是您在代碼中做出的選擇。如果您希望讓它們保持順序(即Send),則可以使用同步命令。或者如果你仍然希望它們由於某種原因而成爲異步的,那麼在下一次迭代時,你也有一些信號量和互斥量的東西來停止執行......這裏有很多選項,你只需要選擇一個最適合你的選項。

+0

非常感謝,這是很大的幫助 –

0

您對每個IP地址都調用Ping.SendAsync()方法,這是一種異步方法,因此響應不一定會按照它們發送的順序返回。

您可以使用Ping.Send()方法嗎?

相關問題