首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[散分+冷饭+分享].NET C# 怎么监控并及时的显示另一个控制台Console的输出

2012-01-09 
[散分+冷饭+分享].NET C# 如何监控并及时的显示另一个控制台Console的输出Blog地址: http://blog.csdn.net

[散分+冷饭+分享].NET C# 如何监控并及时的显示另一个控制台Console的输出
Blog地址: http://blog.csdn.net/lost_painting/article/details/6615201

  这个话题已经很多前辈已经提及或者说明过,不过今天我还是来炒下冷饭.
很多人在论坛上问及,在不修改现有项目的前提下如何监控其控制台输出?这里我们就需要用到ProcessStartInfo中的RedirectStandardOutput以及StandardOutput属性.
关于StandardOutput以及RedirectStandardOutput,我不在此罗嗦,有兴趣的可以参考下MSDN:
http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.80).aspx

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

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

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

代码如下:


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


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

C# code
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即可


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


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


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

C# code
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();  } 


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


[解决办法]
沙发。。
[解决办法]
嗯,我们基本就是这么用的,强啊!
[解决办法]
学习了,后面那个其实跟ReadBlock是一个意思
[解决办法]
Mark,睡醒了起来学习下!
[解决办法]
Mark 学习了
[解决办法]
mark
[解决办法]
牛人啊
[解决办法]
虽然用其它方法实现了
还是感谢LZ,
又学了一种新方法

------解决方案--------------------


mark
[解决办法]
学习了,谢谢分享
[解决办法]
学习一下。
[解决办法]
支持,应该很快会被加精了
[解决办法]
很好很强大,mark
顶你下
[解决办法]
不错,以前也用过一点
winscp.StartInfo.FileName = "C:\\Program Files\\WinSCP\\WinSCP.com";
//winscp.StartInfo.Arguments = "/log=" + logPath;
winscp.StartInfo.UseShellExecute = false;
winscp.StartInfo.RedirectStandardInput = true;
winscp.StartInfo.RedirectStandardOutput = true;
winscp.StartInfo.CreateNoWindow = true;
winscp.Start();
winscp.StandardInput.WriteLine("open " + SFTPusername + ":" + SFTPpassword + "@" + SFTPhost + " -hostkey=\"" + SFTPhostkey + "\"");
winscp.StandardInput.WriteLine("ls " + remotepath);

winscp.StandardInput.Close();
winscp.WaitForExit();
StreamReader rd = winscp.StandardOutput;

while (rd.Peek() != -1)
{
msg.Add(rd.ReadLine());

}
[解决办法]
支持!!!
[解决办法]
mark
[解决办法]
mark
[解决办法]
mark 学习
[解决办法]
支持,学习
[解决办法]
支持,学习
[解决办法]

探讨
支持,应该很快会被加精了

[解决办法]
学习学习!
[解决办法]
还有个事件可以做到即时输出。OutputDataReceived 


[解决办法]
学习学习,谢谢楼主分享
[解决办法]
新手不懂,记一下应该用得着
[解决办法]
其实更好的方法是:http://jm47.com/document/1031

解决Process因缓冲区满而导至进程阻塞的办法

实时读取,
[解决办法]
mark
[解决办法]
路过!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[解决办法]
看看,不错,有空学习一下
[解决办法]
mark
[解决办法]
过来学习一下!
console
[解决办法]
ding...
[解决办法]
up up


[解决办法]
ding..
[解决办法]
学习了,谢谢分享
[解决办法]
管道,获取输入输出流?
[解决办法]
学习了。。。
[解决办法]
学习了,接分了
[解决办法]
46 4s165s1啊
[解决办法]
学习了!!!!!!!!!
[解决办法]
mark

热点排行