2011-12-04 30 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

保持简单,使其成为您班级的一个领域。 –

相关问题