NetworkInformation.Ping (), результат отменен в .NET 4.0, (но не в 3.5) - PullRequest
0 голосов
/ 04 декабря 2011

Я изменил целевой фреймворк с 3.5 на 4.0, других изменений нет.Простой пинг, который работал с 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

1 Ответ

1 голос
/ 05 декабря 2011
Using ping As New System.Net.NetworkInformation.Ping()
   '' etc
End Using

Да, это не сработает. Вы удаляете объект ping до завершения асинхронной отправки. Раньше вам это удавалось, потому что класс Ping неправильно реализовал метод Dispose (). Это исправлено в .NET 4, отчет обратной связи здесь .

Исправление простое, удалите Используя. Правильно утилизировать его не так просто, когда вы используете его асинхронно. Попробуйте это в случае или не беспокойтесь.

В противном случае хорошая демонстрация того, как исправления ошибок в фреймворке могут нарушить работу кода:)

...