c# - por - Cómo detener un proceso desde System.Diagnostics.Process y obtener las estadísticas al final
cerrar otra aplicacion desde c# (1)
Estoy usando este código, pero cuando detengo el proceso no obtiene las estadísticas de ping:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "ping";
p.StartInfo.Arguments = "-c " + count + " -i " + interval + " -s " + buffer + " -W " + timeout + " " + address;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
string readData = "";
DateTime dt = DateTime.Now.AddSeconds(5);
if (p.Start())
{
Scanner scanner = new Scanner(p.StandardOutput.BaseStream);
while (scanner.HasNextLine)
{
readData = scanner.NextLine().ToString();
Console.WriteLine(readData.ToString());
if (!string.IsNullOrEmpty(readData) && !readData.StartsWith("---"))
{
Match M = Regex.Match(readData, @"^[/d]+ bytes from ([^:]+): [^ ]+ ttl=([/d]+) time=([^ ]+) ms");
if (M != null && M.Success)
{
string IP = M.Groups[1].Value;
string TTL = M.Groups[2].Value;
string timeStr = M.Groups[3].Value;
Console.WriteLine(String.Format("Ping to {0} took {2} ms with a ttl of {1}", IP, TTL, timeStr));
// Parsing the timeStr will work the same way as above
if(dt > DateTime.Now)
{
p.StandartInput.Write("/x3");
}
}
else
{
Match M1 = Regex.Match(readData, @"^rtt [^0-9]*([/d][^//]+)//([^//]+)//([^//]+)//([^ ]+) ms$");
if (M1 != null && M1.Success)
{
float avgPingTime = 0;
float maxPingTime = 0;
float minPingTime = 0;
string minPingString = M1.Groups[1].Value;
string avgPingString = M1.Groups[2].Value;
string maxPingString = M1.Groups[3].Value;
// Now parse that value
float.TryParse(minPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out minPingTime);
float.TryParse(avgPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out avgPingTime);
float.TryParse(maxPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out maxPingTime);
Console.WriteLine(String.Format("Min Time : {0} , AVG {2} ms, Max Time {1}", minPingTime, maxPingTime, avgPingTime));
}
}
}
}
}
Sin uso
if(dt > DateTime.Now)
{
p.StandartInput.Write("/x3");
}
el resultado se muestra así:
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=46 time=13.9 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=46 time=13.9 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3016ms
rtt min/avg/max/mdev = 13.910/13.926/13.951/0.010 ms
pero si detengo el ping
usando p.StandartInput.Write("/x3");
nunca va a la parte de statistics
se cuelga en la secuencia 1 : 64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms
y no continúa leyendo, ¿cómo mostrar las statistics
después de detener el proceso de ping
?
en otras palabras, mi problema es que cuando el usuario desea detener el ping
debe mostrar las statistics
para el momento específico en que se utilizó para hacer ping ...
ACTUALIZAR
Implementé p.StandartInput.Write("/x3");
e interrumpe el proceso de ping, pero no muestra las estadísticas y simplemente se cuelga allí.
Si en realidad está interesado en los valores de ping, ¿por qué no simplemente usa la clase ping? https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110).aspx