2016-12-13 7 views
0

Ich bin ziemlich neu in C# und Programmierung als Ganzes.Ping(). Senden Ursachen Ursachen

Ich entschied mich, eine kleine Anwendung zu machen, die die Ping-Zeiten zu ein paar großen Websites ausmessen würde, so dass es leicht zu sehen ist, wenn ich Verbindungsprobleme habe ... Jetzt ist mein Problem, dass jedes Programm sendet ein ping Anfrage das ganze Programm friert ein und stürzt oft ab.

Dies ist der Code, den ich verwende:

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

Das ist, weil Sie es synchron aufrufen, verwenden Sie die Async-Methode - https://msdn.microsoft.com/en-us/library/ms144961(v=vs.110).aspx – Lloyd

Antwort

2

Ihre Anwendung friert, weil die Ping-Anfrage auf dem gleichen Thread ausgeführt wird, die Benutzeroberfläche anzeigt. Die Anwendung wartet daher darauf, dass die Antwort des Ping empfangen wird, bevor sie mit anderen Dingen fortfahren kann. Je länger es dauert, bis der Ping antwortet, desto länger ist die Anwendung in einem gesperrten Zustand.

Wenn Sie mit der Ping.Async() Methode wechseln, kann die tatsächliche Ping-Anforderung im Hintergrund durchgeführt werden und daher nicht mit dem UI interferieren, etwa so:

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

Allerdings werden Sie immer noch Ihre machen müssen Anwendung aktualisieren ihre Benutzeroberfläche mit dem neuen Wert, wenn die Antwort zurückkommt. Das obige Beispiel wird nur die lokale Google Variable mit dem Ergebnis des Ping aktualisieren, aber Ihr UI-Thread wird nicht wissen, dass der Wert geändert wurde.

Wie genau Sie das tun, hängt ein wenig davon ab, welches Framework (Winforms, WPF, Console) Ihre Benutzeroberfläche betreibt und wie Sie Ihre UI eingerichtet haben, die Sie in Ihrer Frage nicht wirklich angegeben haben.

+0

Ich scheine zu bekommen - 1 als Ergebnis. –

+0

@JariSchockaert, diese Antwort ist kein vollständiger Code. Da der Ping nun als asynchroner Aufruf ausgeführt wird, wartet der Code nicht automatisch auf die Rückgabe des Ergebnisses und daher wird der Anfangswert von -1 noch nicht aktualisiert. Das Beispiel in der verknüpften [MSDN-Seite] (https://msdn.microsoft.com/en-us/library/ms144961 (v = vs.110) .aspx) hat eine korrekte Möglichkeit, auf das Ergebnis zu warten (aber nicht unbedingt das Beste je nach eigener Absicht). Befolgen Sie stattdessen dieses Beispiel. – Adrian

Verwandte Themen