在IASyncResult内部为Ping捕获异常

时间:2019-01-03 14:03:44

标签: c# .net

和新年快乐:)

我需要检查公司中计算机的连接性。如果在线,我会检索这些信息,解锁一些按钮等。实际上,我需要按计算机的主机名来ping计算机。经过Google的一些搜索,我发现了以下代码。但是,如果主机名不存在或无法ping通,我会有一个无法捕获的异常。我需要尽快答复,并且不要冻结我的UI。

public static bool GetPing(string hostname)
    {
        if (hostname == null || hostname == string.Empty)
        {
            return false;
        }

        bool pingable = false;

        try
        {
            Func<PingReply> pingDelegate = () => new Ping().Send(hostname);
            IAsyncResult result = pingDelegate.BeginInvoke(r => pingDelegate.EndInvoke(r), null); // The exception comes here

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

            Console.WriteLine("ping ok : " + pingable);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception : " + ex.Message);
        }

        return pingable;
    }

我还尝试了更多的“经典”方法,但是如果ping为KO,则答案太长了。

上面的代码就是这样简称:

        private void Button_Click(object sender, RoutedEventArgs e)
    {
        string hostname = tb1.Text;

        var IsOnline = GetPing(hostname);

        if (IsOnline)
        {
            // Hostname ping ok
        }
        else
        {
            // Hostname do not ping
        }
    }

最后,当对主机名执行ping操作时,回复很快(对或错),但是如果为False,几秒钟后我的应用程序崩溃,并显示消息“用户代码未处理异常” ... 有人可以帮我吗?

0 个答案:

没有答案