如何从 System.Diagnostics.Process 停止进程并最终获取统计信息 [英] How to stop a process from System.Diagnostics.Process and get the statistics in the end
问题描述
我正在使用此代码,但是当我停止该过程时,它没有获得 ping 统计信息:
I'm using this code but when i stop the process it not get the ping statistics :
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));
}
}
}
}
}
不使用
if(dt > DateTime.Now)
{
p.StandartInput.Write("x3");
}
结果显示如下:
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
但是如果我使用 p.StandartInput.Write("x3");
停止 ping
它永远不会进入 statistics
部分它挂在 sequence 1 :64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms
并且不要继续阅读,如何显示 统计信息
停止 ping
进程后?
but if I stop the ping
using p.StandartInput.Write("x3");
it never goes to the statistics
part it hangs at sequence 1 : 64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms
and dont continue reading , how to show the statistics
after stoping the ping
process ?
换句话说,我的问题是当用户想要停止 ping
时,它应该在用于 ping 的特定时间内显示 statistics
...
in other words my problem is when the user want to stop the ping
it should display the statistics
for the certain time that it was used to ping...
更新
我已经实现了 p.StandartInput.Write("/x3");
并且它中断了 ping 过程,但它不显示统计信息,只是挂在那里.
I have implemented p.StandartInput.Write("/x3");
and it interrupts the ping process but it does not display the statistics and just hangs there.
推荐答案
如果您真的对 ping 值感兴趣,为什么不直接使用 ping 类?https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110).aspx
If you are actually interested in the ping values, why not just use the ping class? https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110).aspx
这篇关于如何从 System.Diagnostics.Process 停止进程并最终获取统计信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!