.NET上控制台输出的实时截取

.NET上控制台输出的实时截取

.NET上控制台输出的实时截取分两种不同的情况:截取子进程的输出和截取当前进程的输出。

截取子进程的输出可以使用Process.StandardOutput属性取得一个StreamReader,并用它来读取输出。注意读取操作是阻塞的,可以使用异步方法调用或者Process.BeginOutputReadLine()来进行异步读取。例子如下:

Process p = new Process();
p.StartInfo.UseShellExecute = false; // 必须
p.StartInfo.RedirectStandardOutput = true; // 必须
p.StartInfo.FileName = "SomeApp.exe";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

截取当前进程的输出可以使用Console.SetOut()。使用这种方法需要从TextWriter派生一个类,用于接收输出。但这个方法有个缺陷,就是只能截获Console类的输出,而对非托管的C运行库printf的输出不起作用。哪位高人知道解决方法的话望赐教。例子如下:

Console.SetOut(new TextBoxWriter(textBox1));

class TextBoxWriter : TextWriter
{
    TextBox textBox;
    delegate void WriteFunc(string value);
    WriteFunc write;
    WriteFunc writeLine;

    public TextBoxWriter(TextBox textBox)
    {
        this.textBox = textBox;
        write = Write;
        writeLine = WriteLine;
    }

    // 使用UTF-16避免不必要的编码转换
    public override Encoding Encoding
    {
        get { return Encoding.Unicode; }
    }

    // 最低限度需要重写的方法
    public override void Write(string value)
    {
        if (textBox.InvokeRequired)
            textBox.BeginInvoke(write, value);
        else
            textBox.AppendText(value);
    }

    // 为提高效率直接处理一行的输出
    public override void WriteLine(string value)
    {
        if (textBox.InvokeRequired)
            textBox.BeginInvoke(writeLine, value);
        else
        {
            textBox.AppendText(value);
            textBox.AppendText(this.NewLine);
        }
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值