如何从 System.Diagnostics.Process 停止进程并最终获取统计信息 [英] How to stop a process from System.Diagnostics.Process and get the statistics in the end

查看:19
本文介绍了如何从 System.Diagnostics.Process 停止进程并最终获取统计信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码,但是当我停止该过程时,它没有获得 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆