这个问题在这里已有答案:
我有这种方法发送ping一段时间。
public async Task<bool> TryToConnect(bool firstTime, int second)
{
var valueToReturne = false;
if (firstTime)
await Task.Delay(1200);
var ct = new CancellationTokenSource(TimeSpan.FromSeconds(second)).Token;
var pingSender = new Ping();
PingReply result;
try
{
while (!ct.IsCancellationRequested)
{
result = await pingSender.SendPingAsync("www.google.com", 100);//null exeption
if (result.Status != IPStatus.Success)
continue;
valueToReturne = true;
break;
}
}
catch (Exception)
{
valueToReturne = await TryToConnect(false, second / 2);
}
return valueToReturne;
}
由于我不知道的原因。该
result = await pingSender.SendPingAsync("www.google.com", 100);
有时命令没有通过null异常的Internet访问,并且方法转到catch块,因为ct结束。但我想执行
result = await pingSender.SendPingAsync("www.google.com", 100);
在任何情况下命令为ct持续时间。
即使第一个ping返回异常,ping也会异步重试。因此,需要注册ping完成事件,以便您知道ping正在重试直到超时。请找到以下代码:
private void Form1_Load(object sender, EventArgs e)
{
var result = TryToConnect();
}
private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
{
if (e.Cancelled)
return;
if (e.Error != null)
return;
if (e.Reply.Status == IPStatus.Success)
{
}
}
private bool TryToConnect()
{
Ping myPing = new Ping();
int timeOutMS = 5000; //5 seconds
myPing.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
try
{
myPing.SendAsync("www.google.com", timeOutMS);
return true;
}
catch
{
return false;
}
}