如何在C#中防止来自null异常的pingSender.SendPingAsync? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有这种方法发送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持续时间。

c# wpf null argumentnullexception
1个回答
-2
投票

即使第一个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;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.