2016-12-13 2 views
0

Я довольно новичок в C# и программировании в целом.Ping(). Отправить причины lag

Я решил сделать небольшое приложение, которое будет измерять время ping на пару больших сайтов, поэтому легко увидеть, когда у меня возникли проблемы с подключением ... Теперь моя проблема в том, что каждый раз, когда программа отправляет Запрос ping вся программа зависает и часто сбой.

Это код, который я использую:

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

Это потому, что вы вызываете его синхронно, используйте метод async - https://msdn.microsoft.com/en-us/library/ms144961(v=vs.110).aspx – Lloyd

ответ

2

Ваш замерзает приложений, так как запрос пинг выполняется на том же потоке, который отображает ваш пользовательский интерфейс. Таким образом, приложение ожидает ответа на запрос ping, прежде чем он сможет продолжить выполнение других действий. Чем дольше ответит пинг, тем дольше приложение будет находиться в заблокированном состоянии.

При переключении с использованием метода Ping.Async(), фактический запрос Ping можно сделать в фоновом режиме и, следовательно, не INTERFER с пользовательским интерфейсом, например, так:

long Google = -1; 
var ping = new Ping(); 
ping.PingCompleted += (s,a) => Google = a.Reply.RoundtripTime; 
ping.SendAsync("google.com",null); 

Однако, вам все равно придется сделать свой приложение обновляет свой интерфейс с новым значением, когда возвращается ответ. В приведенном выше примере только обновляется локальная переменная Google с результатом ping, но ваш поток пользовательского интерфейса не будет знать, что значение было изменено.

Как именно вы это сделаете, это будет зависеть от того, какая инфраструктура (Winforms, WPF, Console) включает ваш пользовательский интерфейс и как вы настроили свой пользовательский интерфейс, который вы на самом деле не задали в своем вопросе.

+0

Я, кажется, получаю - 1 в результате. –

+0

@JariSchockaert, этот ответ не является полным кодом. Поскольку ping теперь выполняется как асинхронный вызов, код не будет автоматически ждать возвращения результата и, следовательно, начальное значение -1 еще не обновлено. Пример на странице [MSDN] (https://msdn.microsoft.com/en-us/library/ms144961 (v = vs.110) .aspx) имеет правильный способ дождаться результата (но не обязательно лучший в зависимости от вашего собственного намерения). Выполните этот пример. – Adrian