2011-12-04 7 views
0

ターゲットフレームワークを3.5から4.0に変更しました。それ以外の変更はありません。 3.5で動作していた単純なpingでは、結果が4.0になり、Canceled = 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

修正は簡単です。使い方を削除してください。非同期で使用すると、適切に処理するのは簡単ではありません。イベントで試してみるか、気にしないでください。

そうでない場合は、フレームワークのバグ修正がゆっくりと動作するコード:)

+0

ありがとう! OnPingResultメソッドで処理するために、ping.SendAsync呼び出しでpingインスタンスをトークンパラメータとして送信できますか? – bretddog

+0

シンプルにして、クラスのフィールドにしてください。 –

関連する問題