在C#如果程序不断输出,你如何从DOS程序读取? [英] In C# How do you read from DOS program you executed if the program is constantly outputting?

查看:128
本文介绍了在C#如果程序不断输出,你如何从DOS程序读取?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了许多编码的例子,如何执行cmd.exe和执行命令,甚至执行nslookup和交互,但我遇到的问题是一个特定的dos程序,当它启动时,它不停止输出。这里是一些代码,我会给一个注释和错误,我从C#

I have found many examples of coding on how to execute cmd.exe and execute a command, and execute even nslookup and interact, but the problem I am having is with a particular dos program that when it starts, it does not stop "outputting". here is some code and I will put a comment and the errors I get from C#

这是我如何设置在更高级的方式,所以我可以接收输出程序在事件

Here is how I have it setup in a more advanced way so I can receive output from the program on events

public void StartApplication(string appNameAndPath)
{
        StreamReader outputStream;
        Process p = new Process();
        p.StartInfo.FileName = appNameAndPath;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = false;//for now just so I can see it
        p.Start();
//here is my advanced example
if(advanced == true)
{
        outputStream = p.StandardOutput;
        DoReadOutPut();
}
else
{//here is a simple example 
    while (p.StandardOutput.ReadLine() != null)  //this hangs here until the application exists
    {
        txt += (p.StandardOutput.ReadLine());
    }
}
}

 void DoReadOutput()
 {
        outputStream.BaseStream.BeginRead( readOutputBuffer, 0, readOutputBuffer.Length, new AsyncCallback( OnReadOutputCompleted ), null );  
       //this does sometimes fire but only with 0 bytes, on other dos programs it would say Memory read not allowed
 }

 void OnReadOutputCompleted( IAsyncResult result )
 {
        int cbRead = outputStream.BaseStream.EndRead( result );
        ProcessOutput( readOutputBuffer, cbRead );
        DoReadOutput();
 }

 private void ProcessOutput(byte[] buffer, int cbRead)
 {
        string text = p.StartInfo.StandardOutputEncoding.GetString(buffer, 0, 10000); //this is where it hangs until the program exits or is not writing anymore
        this.Invoke((Action)delegate
        {

            SetTextBoxValue(text);//im doing this because im on another thread otherwise textBox1.Text - text"

        });
  }

我不想使用API​​和 GetText 并创建引擎 ReadLastLine while(true){Console.WriteLine(bla);}

I do not want to have to use API and GetText and create an engine to ReadLastLine, can anyone help me with this? I suppose you would want an example exe, creating a C# application that while(true){Console.WriteLine("bla");} would suffice as the example exe but not the exe I am having trouble with. The exe takes over the dos window and has an "old school interface"

推荐答案

async / await可以在这里帮助。

async/await can help here....

await Exec(yourExe,parameters);







Task Exec(string exe,string args)
{
    var tcs = new TaskCompletionSource<object>();

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = exe;
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.Arguments = args;

    var proc = Process.Start(psi);

    proc.OutputDataReceived += (s, e) =>
    {
        this.Invoke((Action) (()=>richTextBox1.AppendText(e.Data + Environment.NewLine)));
    };

    proc.Exited += (s, e) => tcs.SetResult(null);

    proc.EnableRaisingEvents = true;
    proc.BeginOutputReadLine();

    return tcs.Task;
}

这篇关于在C#如果程序不断输出,你如何从DOS程序读取?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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