首先,为什么不直接使用Process.StandardInput
属性作为您的目标呢,就像这样:
var process = new Process
{
};
var xmlSerializer = new XmlSerializer(data.GetType());
var xmlwriter = XmlWriter.Create(process.StandardInput, xmlWriterSettings);
xmlSerializer.Serialize(xmlwriter, data);
否则,
msdn-entry提供了一个清晰的如何使用
Process.BeginOutputReadLine()
的方法,你可以重新设计它。
var autoResetEvent = new AutoResetEvent(false);
var process = new Process
{
};
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, args) => {
autoResetEvent.Set();
};
process.Start();
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream))
{
var xmlSerializer = new XmlSerializer(data.GetType());
var xmlwriter = XmlWriter.Create(streamWriter, xmlWriterSettings);
xmlSerializer.Serialize(xmlwriter, data);
}
memoryStream.Position = 0;
using (var streamReader = new StreamReader(memoryStream))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
process.StandardInput.WriteLine(line);
Console.WriteLine(line);
process.BeginOutputReadLine();
autoResetEvent.WaitOne();
}
}
}
无论如何 - 我知道这应该是一条评论 - 你等待进程写入东西是否有具体原因?
StandardOutput 流可以同步或异步读取。Read、ReadLine 和 ReadToEnd 等方法在进程的输出流上执行同步读操作。这些同步读操作不会完成,直到关联的进程向其 StandardOutput 流写入内容或关闭流为止。相比之下,BeginOutputReadLine 在 StandardOutput 流上启动异步读操作。此方法使指定的事件处理程序能够处理流输出,并立即返回给调用方,调用方可以在流输出被定向到事件处理程序时执行其他工作。
这意味着,如果您的进程没有写任何内容(而且您正在等待),那么您将无限期地等待响应...
编辑
您还应添加一个
Process.ErrorDataReceived
处理程序,例如:
process.StartInfo.RedirectStandardError = true;
process.ErrorDataReceived += (sender, args) => {
autoResetEvent.Set();
};
并且
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
process.StandardInput.WriteLine(line);
Console.WriteLine(line);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
autoResetEvent.WaitOne();
}
还需要处理错误情况(无论是什么意思)。