1

.NET のクラス「PingReply」を使用して、特定のホストへの接続をテストするツールを作成しています。私の問題は、ping の結果が失敗した場合、結果を得るまでに時間がかかることです。LAN環境なので、100ms以上かかると接続に失敗していると推測できます。以下のコードは、ホストへの接続が失敗した場合の 5 秒後 (5000 ミリ秒) の結果を示しています。接続に失敗しても、より速い結果を得ることができますか?

Ping x = new Ping();
PingReply reply = x.Send(IPAddress.Parse("192.168.0.1")); 
if (reply.Status == IPStatus.Success)
{
    //Do something
}
4

5 に答える 5

3

私たちはあなたの ping オブジェクトを見ることができないので、あなたが TIMEOUT について知らないと仮定してはいけません。私は通常、非同期 ping を送信し、タイムアウトを 3 秒に設定します。

 try
            {
                Ping ping = new Ping();
                ping.PingCompleted += (sender, e) =>
                {
                    if (e.Reply.Status != IPStatus.Success)
                        // Report fail
                    else                    
                       // Report success

                };
                ping.SendAsync(target, 3000, target); // Timeout is 3 seconds here
            }
            catch (Exception)
            {
                return;
            }
于 2013-01-16T15:04:36.110 に答える
3

非同期デリゲートを使用して Ping を開始できます。非同期デリゲートには、IAsyncResult をすぐに返すバックグラウンド スレッドを開始する BeginInvoke という関数があります。IAsyncResult には、待機時間を割り当てることができる WaitOne というメソッドを持つ AsyncWaitHandle という待機ハンドラーがあります。これにより、現在のスレッドがミリ秒単位で一定時間フリーズされます。この場合は 100 です。プロパティ IsCompleted を使用して、スレッドが作業を完了したかどうかを確認できます。例えば:

Func<PingReply>  pingDelegate = () => new Ping().Send(IPAddress.Parse("192.168.0.1"));

IAsyncResult result = pingDelegate.BeginInvoke(r => pingDelegate.EndInvoke(r), null);

//wait for thread to complete
result.AsyncWaitHandle.WaitOne(100);

if (result.IsCompleted)
{
    //Ping Succeeded do something
    PingReply reply = (PingReply) result;

    //Do something with successful reply
}
于 2013-01-16T15:35:40.333 に答える
3

Ping.Send() メソッドにタイムアウトを渡すことができます。オーバーロードされたメンバーを確認してください。

于 2013-01-16T15:05:58.753 に答える
3

Ping.Send()には、タイムアウト パラメータを持つオーバーロードがあります。

PingReply reply = x.Send(IPAddress.Parse("192.168.0.1"), 100);
于 2013-01-16T15:07:27.447 に答える