C# Ping().Send导致延迟

C# Ping().Send导致延迟,c#,c#-4.0,C#,C# 4.0,我对C#和整个编程相当陌生 我决定做一个小应用程序,它可以测量出几个大网站的ping时间,这样当我出现连接问题时就很容易看到了。。。 现在我的问题是,每次程序发送ping请求时,整个程序都会冻结并经常崩溃 这是我正在使用的代码: long Google = new Ping().Send("google.com").RoundtripTime; 应用程序冻结,因为ping请求正在显示用户界面的同一线程上执行。因此,应用程序正在等待收到ping的响应,然后才能继续执行其他操作。ping响应的时间

我对C#和整个编程相当陌生

我决定做一个小应用程序,它可以测量出几个大网站的ping时间,这样当我出现连接问题时就很容易看到了。。。 现在我的问题是,每次程序发送ping请求时,整个程序都会冻结并经常崩溃

这是我正在使用的代码:

long Google = new Ping().Send("google.com").RoundtripTime;

应用程序冻结,因为ping请求正在显示用户界面的同一线程上执行。因此,应用程序正在等待收到ping的响应,然后才能继续执行其他操作。ping响应的时间越长,应用程序处于锁定状态的时间就越长

如果切换到使用该方法,实际的Ping请求可以在后台完成,因此不会干扰UI,如下所示:

long Google = -1;
var ping =  new Ping();
ping.PingCompleted += (s,a) => Google = a.Reply.RoundtripTime;
ping.SendAsync("google.com",null);
但是,当响应返回时,您仍然需要让应用程序使用新值更新其UI。上面的示例只会使用ping的结果更新本地
Google
变量,但是您的UI线程不会知道该值已经更改


具体如何实现这一点取决于为用户界面供电的框架(Winforms、WPF、Console)以及用户界面的设置方式,而您在问题中并未具体说明这一点。

您的应用程序会冻结,因为ping请求是在显示用户界面的同一线程上执行的。因此,应用程序正在等待收到ping的响应,然后才能继续执行其他操作。ping响应的时间越长,应用程序处于锁定状态的时间就越长

如果切换到使用该方法,实际的Ping请求可以在后台完成,因此不会干扰UI,如下所示:

long Google = -1;
var ping =  new Ping();
ping.PingCompleted += (s,a) => Google = a.Reply.RoundtripTime;
ping.SendAsync("google.com",null);
但是,当响应返回时,您仍然需要让应用程序使用新值更新其UI。上面的示例只会使用ping的结果更新本地
Google
变量,但是您的UI线程不会知道该值已经更改


具体如何实现这一点将取决于哪个框架(Winforms、WPF、Console)为您的UI供电,以及您如何设置您的UI,而您在问题中并未具体说明。

这是因为您是同步调用它,请使用异步方法-这是因为您是同步调用它,使用异步方法-结果似乎是-1。@Jarischockert,这个答案不是完整的代码。由于ping现在作为异步调用进行,因此代码不会自动等待结果返回,因此-1的初始值尚未更新。链接中的示例有一个等待结果的正确方法(但不一定是最好的,这取决于您自己的意图)。按照这个例子来做。结果我似乎得到了-1。@Jarischockert,这个答案不是完整的代码。由于ping现在作为异步调用进行,因此代码不会自动等待结果返回,因此-1的初始值尚未更新。链接中的示例有一个等待结果的正确方法(但不一定是最好的,这取决于您自己的意图)。而要遵循这个例子。