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

鸭梨山大帝 2011-07-18 09:25:19
加精
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的方法来读取所有的输出.

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

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

代码如下:


view plain
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();
}


这样就实现了及时快速的监控其他控制台程式的输出.
...全文
2589 172 打赏 收藏 转发到动态 举报
写回复
用AI写文章
172 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzqGyula 2013-12-16
  • 打赏
  • 举报
回复
请问,我按照你的方法做出现一个问题是什么原因?
private static String FilePath = Application.StartupPath + "\\DigitalSwitching.exe";

        private void SignalMonitor_Load(object sender, EventArgs e)
        {
            using (Process process=new System.Diagnostics.Process())
            {
                process.StartInfo.FileName = FilePath;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.Start();
                process.BeginOutputReadLine();
                process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
            }             
        }
程序启动后,通过点击按钮弹出一个Form,Form中有一个多行文本显示Console读取到的数据,点击后程序又重新运行显示两个进程这怎么解决??
战灬龙 2011-07-28
  • 打赏
  • 举报
回复
Mark
student_jianwen 2011-07-28
  • 打赏
  • 举报
回复
学习了· ·
七夜_雪 2011-07-28
  • 打赏
  • 举报
回复
好东西大家一起分享...
xuyiazl 2011-07-28
  • 打赏
  • 举报
回复
Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
processStartInfo.FileName = file;
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.CreateNoWindow = true;
process.StartInfo = processStartInfo;
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
{

});
process.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{

});
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
Teng_s2000 2011-07-28
  • 打赏
  • 举报
回复
Mark~~
li0129 2011-07-27
  • 打赏
  • 举报
回复
新手学习
广木 2011-07-27
  • 打赏
  • 举报
回复
路过接分
夏虫 2011-07-27
  • 打赏
  • 举报
回复
MARK
wulg10 2011-07-26
  • 打赏
  • 举报
回复
mark,
和永恒有關 2011-07-26
  • 打赏
  • 举报
回复
````````````
student_jianwen 2011-07-26
  • 打赏
  • 举报
回复
留着用!多像楼主学习,
` `
zhubo006 2011-07-26
  • 打赏
  • 举报
回复
这个有什么用吗?
yanyu062622 2011-07-25
  • 打赏
  • 举报
回复
路过;
言多必失 2011-07-25
  • 打赏
  • 举报
回复
学习学习。
yidichaxiang 2011-07-25
  • 打赏
  • 举报
回复
mark
xiaoheshang_999 2011-07-24
  • 打赏
  • 举报
回复
写的不错 !
mainsea 2011-07-24
  • 打赏
  • 举报
回复
顶一个啊
mrsupersky 2011-07-24
  • 打赏
  • 举报
回复
mark 一下呗
sinatomsohu 2011-07-23
  • 打赏
  • 举报
回复
hh,do test
加载更多回复(143)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧