我正在从字符串(地址)列表中ping主机.一切都很完美,但是当主机无法访问时,ping返回Result.Address
:"0.0.0.0"而不是我传入SendPingAsync函数的现有地址或主机名.这是我的代码:
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());
Run Code Online (Sandbox Code Playgroud)
我在这里找到了解决方案,但我需要在SendPingAsync
功能上做同样的事情而不是SendAsync
.我怎样才能找回通过host name / ip address
从pingReply.Result
?
您可以使用编写扩展方法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; }
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以使用它:
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());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1612 次 |
最近记录: |