问题
I'm pinging hosts from list of strings (addresses). Everything works perfectly but when host is unreachable ping returns Result.Address
: "0.0.0.0" instead of existing address or hostname which I passed into SendPingAsync function.
Here is my code:
var pingTasks = addresses.Select(address =>
{
return new Ping().SendPingAsync(address);
});
await Task.WhenAll(pingTasks);
StringBuilder pingResultBuilder = new StringBuilder();
foreach (var pingReply in pingTasks)
{
pingResultBuilder.Append(pingReply.Result.Address);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.Status);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.RoundtripTime.ToString());
pingResultBuilder.AppendLine();
}
Console.WriteLine(pingResultBuilder.ToString());
I found solution here but I need to do the same thing in SendPingAsync
function instead of SendAsync
.
How can I retrieve passed host name / ip address
from pingReply.Result
?
回答1:
You can write an extension method using SendAsync
.
public static class MyExtensions
{
public static Task<PingResult> SendTaskAsync(this Ping ping, string address)
{
var tcs = new TaskCompletionSource<PingResult>();
PingCompletedEventHandler response = null;
response = (s, e) =>
{
ping.PingCompleted -= response;
tcs.SetResult(new PingResult() { Address = address, Reply = e.Reply });
};
ping.PingCompleted += response;
ping.SendAsync(address, address);
return tcs.Task;
}
public class PingResult
{
public string Address { set; get; }
public PingReply Reply { set; get; }
}
}
You can now use it like:
var pingTasks = addresses.Select(address =>
{
return new Ping().SendTaskAsync(address);
});
var replies = await Task.WhenAll(pingTasks);
StringBuilder pingResultBuilder = new StringBuilder();
foreach (var pingReply in replies)
{
pingResultBuilder.Append(pingReply.Address);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Reply.Status);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Reply.RoundtripTime.ToString());
pingResultBuilder.AppendLine();
}
Console.WriteLine(pingResultBuilder.ToString());
来源:https://stackoverflow.com/questions/25534085/retrieving-ping-host-name-from-sendpingasync-result