.NET C# 如何监控并及时的显示另一个控制台Console的输出

    这个话题已经很多前辈已经提及或者说明过,不过今天我还是来炒下冷饭.

很多人在论坛上问及,在不修改现有项目的前提下如何监控其控制台输出?

这里我们就需要用到ProcessStartInfo中的RedirectStandardOutput以及StandardOutput属性

关于StandardOutput以及RedirectStandardOutput,我不在此罗嗦,有兴趣的可以参考下MSDN:

http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.80).aspx

而且其中微软已经给了Stream.ReadToEnd的方法来读取所有的输出.

以下的的例子中提及的是如何逐行输出以及如何及时的输出.

首先准备一个被监控的控制台进程,以下例子为逐行输出

代码如下:

        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Testing in :" + DateTime.Now.ToString());
                System.Threading.Thread.Sleep(50);
            }
            
        }

其监控逐行输出代码如下:

        static void Main(string[] args)
        {
            StreamReader sr;
            ProcessStartInfo s = new ProcessStartInfo();
            s.RedirectStandardInput = true;
            s.RedirectStandardOutput = true;
            s.UseShellExecute = false;
            s.FileName = @"d:\OutputRepeat.exe";
            Process p = Process.Start(s);
            sr = p.StandardOutput;
            while (!sr.EndOfStream)
            {
                string str = sr.ReadLine();
                Console.WriteLine(str);
            }
            p.WaitForExit();
            p.Close();
        }


而有些人会提及如果被监控程式非逐行输出,而其又要很及时的监控这个输出,该怎么办?

别急,看以下例子,我们只需要小小的修改一个地方,把Stream.ReadLine改成Stream.Read即可


准备一个被监控的控制台进程,以下例子为非逐行输出

代码如下:

        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("Testing in :" + DateTime.Now.ToString());
                System.Threading.Thread.Sleep(50);
            }
            
        }

其及时监控输出代码如下:

        static void Main(string[] args)
        {
            StreamReader sr;
            ProcessStartInfo s = new ProcessStartInfo();
            s.RedirectStandardInput = true;
            s.RedirectStandardOutput = true;
            s.UseShellExecute = false;
            s.FileName = @"E:\CSharp\OutputRepeat\bin\Release\OutputRepeat.exe";
            Process p = Process.Start(s);
            sr = p.StandardOutput;
            while (!sr.EndOfStream)
            {
                char[] bs = new char[16];
                int i = sr.Read(bs, 0, 16);
                foreach (char o in bs)
                {
                    Console.Write(o);
                }
            }
            p.WaitForExit();
            p.Close();
        }

这样就实现了及时快速的监控其他控制台程式的输出.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值