【问题标题】:NetworkInformation.Ping(), result cancelled in .NET 4.0, (but not in 3.5)NetworkInformation.Ping(),结果在 .NET 4.0 中取消,(但在 3.5 中没有)
【发布时间】:2012-01-12 18:20:32
【问题描述】:

我将目标框架从 3.5 更改为 4.0,没有其他更改。一个简单的 ping 与 3.5 一起工作,现在与 4.0 结果给出 Canceled=True。有什么想法可能导致这种情况吗?

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

【问题讨论】:

  • 慢慢地,但可以肯定的是,越来越多的大型网站不响应 ping。这不是代码中的错误,而是需要考虑的问题。

标签: .net vb.net .net-4.0 ping


【解决方案1】:
Using ping As New System.Net.NetworkInformation.Ping()
   '' etc
End Using

是的,这不会很好地工作。在异步发送完成之前,您正在处理 ping 对象。因为 Ping 类没有正确实现 Dispose() 方法,所以您之前侥幸逃脱了。该问题已在 .NET 4 中得到修复,反馈报告 is here

修复很简单,去掉Using。当您异步使用它时,正确处理它并不容易。在活动中尝试或不要打扰。

否则,一个很好的演示框架错误修复如何破坏工作代码:)

【讨论】:

  • 谢谢!我可以在 ping.SendAsync 调用中将 ping 实例作为令牌参数发送到 OnPingResult 方法中吗?
  • 保持简单,让它成为你班级的一个领域。
猜你喜欢
  • 2012-09-05
  • 2014-07-10
  • 2013-08-19
  • 2012-03-14
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2011-04-04
相关资源
最近更新 更多