重定向过程的输出

时间:2014-10-29 15:49:55

标签: c# windows windows-7

我正在使用这部分代码从我的C#程序启动第三方命令行应用程序。

// define Process Start Info and give filename of the 3rd Party app
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(FileName);
myProcessStartInfo.CreateNoWindow = true;
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardInput = true;
myProcessStartInfo.RedirectStandardOutput = true;
theProcess.StartInfo = myProcessStartInfo;

// instantiate observer class that contains a function 
// (ProcessStandardOutput) that is run in separate thread
observer = new StreamObserver();

// create the thread            
outputObserverThread = new Thread(observer.ProcessStandardOutput);

// start the 3rd party console application
theProcess.Start();

// set the input stream (to send commands to the console app)
commandStream = theProcess.StandardInput;

// connect the output stream with the observer class
observer.SetOutputStream(theProcess.StandardOutput);
// start the observer thread
outputObserverThread.Start();

// send any command to the console app
SendCommand("init");

这实际上并不特别,并且已经从C#文档示例中获得了70%。

它到目前为止有效。我可以使用SendCommand()将命令发送到控制台应用程序,然后我收到回复。 但有一点输出流卡住了。意思是我没有得到任何文本,甚至缺少前一个文本块的结尾。 通常仅在一行回复中发送的命令将不会传递给流。 通常会产生休息回复的命令(例如" help")将" flush"流和我通过流获取文本(包括丢失的数据)

这是StreamObserver的(简化)实现,它处理输出流:

public class StreamObserver
{
    // Volatile is used as hint to the compiler that this data
    // member will be accessed by multiple threads.
    private volatile bool _shouldStop;
    private volatile StreamReader outputStream;

    // This method will be called when the thread is started.
    public void ProcessStandardOutput()
    {
        while (!_shouldStop)
        {
            string line = outputStream.ReadLine();
            Console.WriteLine(line);
        }
    }
    public void SetOutputStream(StreamReader stream)
    {
        outputStream = stream;
    }
}

这里没什么神奇的......

知道什么可能导致流卡住并在休息数据出现时恢复?

我刚刚计算了返回的文字。看起来块在发送到输出流之前必须包含~4k数据。 那铃响了吗???

顺便说一句,我在Windows 7 64bit和使用Visual Studio 2013教授上运行。

0 个答案:

没有答案