我正在使用这部分代码从我的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教授上运行。