2011-12-04 32 views
0

我將目標框架從3.5更改爲4.0,沒有其他更改。一個簡單的ping與3.5一起工作,現在4.0的結果給出了Cancelled = True。任何想法可能會導致這種情況?NetworkInformation.Ping(),結果在.NET 4.0中取消,但不在3.5中

Public Sub StartInternetConnectionCheckEvery(ByVal seconds As Integer) 
    Dim timer As New Timer() 
    timer.Interval = seconds * 1000 
    AddHandler timer.Tick, AddressOf CheckIsConnectedToInternet 
    timer.Start() 
End Sub 

Private Sub CheckIsConnectedToInternetByTimer(ByVal sender As Object, ByVal e As System.EventArgs) 
    CheckIsConnectedToInternet() 
End Sub 

Public Sub CheckIsConnectedToInternet() 
    Using ping As New System.Net.NetworkInformation.Ping() 
     Dim address As String = "www.google.com" 

     ping.SendAsync(address, Nothing) 
     AddHandler ping.PingCompleted, AddressOf OnPingResult 
    End Using 
End Sub 

Private Sub OnPingResult(ByVal sender As Object, ByVal e As PingCompletedEventArgs) 
    If e.Cancelled Then 
     Trace.WriteLine("InternetHelper: Ping Cancelled") 
     Return 
    End If 

    IsConnectedToInternet = (e.Reply.Status = IPStatus.Success) 
    RaiseEvent InternetPingResult(IsConnectedToInternet) 
End Sub 
+0

慢,但肯定的是,越來越多的大型網站不響應Ping。這不是你的代碼中的錯誤,而是需要思考的問題。 – dbasnett

回答

1
Using ping As New System.Net.NetworkInformation.Ping() 
    '' etc 
End Using 

是的,這是不會工作。在異步發送完成之前,您正在處理ping對象。你之前沒有使用它,因爲Ping類沒有正確實施Dispose()方法。這在.NET 4中得到了修復,反饋報告is here

修復很簡單,刪除使用。當您異步使用它時,正確處理它並不那麼容易。在事件中嘗試或不要打擾。

否則一個很好的示範框架bug修復如何破解工作代碼:)

+0

謝謝!我可以發送ping實例作爲ping.SendAsync調用中的令牌參數,以便在OnPingResult方法中進行處理嗎? – bretddog

+0

保持簡單,使其成爲您班級的一個領域。 –

相關問題