2016-12-13 5 views
0

私はC#とプログラミング全体でかなり新しいです。Ping()。原因の遅れを送信する

私は、いくつかの大きなウェブサイトにping時間を測定するような小さなアプリケーションを作ることにしました。接続の問題が発生したときには簡単に見えます... 今私の問題は、 pingを要求すると、プログラム全体がフリーズし、しばしばクラッシュします。

long Google = new Ping().Send("google.com").RoundtripTime; 
+0

これは同期的に呼び出しているからです。非同期メソッドを使用しています - https://msdn.microsoft.com/en-us/library/ms144961(v=vs.110).aspx – Lloyd

答えて

2

アプリケーションがフリーズをping要求は、ユーザーインターフェイスを表示し、同じスレッド上で実行されているので:

これは私が使用していたコードです。したがって、アプリケーションは、他の処理を続行する前に、pingの応答を待っています。 pingの応答時間が長ければ長いほど、アプリケーションはロックアップ状態になります。

あなたがPing.Async()方法の使用に切り替える場合は、実際のP​​ing要求をバックグラウンドで行うことができ、したがって、そのようなUIと干渉しない:

long Google = -1; 
var ping = new Ping(); 
ping.PingCompleted += (s,a) => Google = a.Reply.RoundtripTime; 
ping.SendAsync("google.com",null); 

は、しかし、あなたはまだあなたを行う必要がありますアプリケーションは応答が戻ったときにそのUIを新しい値で更新します。上記の例では、ローカルのGoogle変数のみがpingの結果で更新されますが、UIスレッドは値が変更されたことを認識しません。

どのようなフレームワーク(Winforms、WPF、Console)があなたのUIにどのような力を与えているのか、実際にあなたの質問に指定していないUIをどのように設定しているのかによって少し異なります。

+0

私は取得しているようです - 1となる。 –

+0

@ JariSchockaert、この回答は完全なコードではありません。 pingは現在非同期呼び出しとして実行されているため、コードは結果が返されるのを自動的に待機しないため、-1の初期値はまだ更新されません。リンクされた[MSDNページ](https://msdn.microsoft.com/en-us/library/ms144961(v = vs.110).aspx)の例は、結果を待つ正しい方法を持っています自分の意図によります)。代わりにその例に従ってください。 – Adrian

関連する問題