C# 当使用System.Diagnostic Process时,我是否会错过进程开始和捕获输出开始之间的一些输出行?
如果我有这样的代码C# 当使用System.Diagnostic Process时,我是否会错过进程开始和捕获输出开始之间的一些输出行?,c#,parsing,process,system.diagnostics,C#,Parsing,Process,System.diagnostics,如果我有这样的代码 proc.Start(); string resultOut; while ( (!proc.HasExited && (resultOut = stdOut.ReadLine()) != null)) { // Do some operation based on resultOut } 从启动proc到捕获/解析开始,我是否容易漏掉一些行,还是等待?如果没有,我能做什么?如果您通过等重定向流程的输入和/或输出,流程输出将直接进入您的流。您不会错过任何输
proc.Start();
string resultOut;
while ( (!proc.HasExited && (resultOut = stdOut.ReadLine()) != null))
{
// Do some operation based on resultOut
}
从启动proc到捕获/解析开始,我是否容易漏掉一些行,还是等待?如果没有,我能做什么?如果您通过等重定向流程的输入和/或输出,流程输出将直接进入您的流。您不会错过任何输入或输出。如果您通过等重定向流程的输入和/或输出,流程输出将直接进入您的流。您不会错过任何输入或输出。以下代码不会丢失标准输出的任何行
var startInfo = new ProcessStartInfo
{
FileName = "my.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (var process = new Process { StartInfo = startInfo })
{
process.ErrorDataReceived += (s, e) =>
{
string line = e.Data;
//process stderr lines
};
process.OutputDataReceived += (s, e) =>
{
string line = e.Data;
//process stdout lines
};
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
}
以下代码不会丢失标准输出的任何行
var startInfo = new ProcessStartInfo
{
FileName = "my.exe",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (var process = new Process { StartInfo = startInfo })
{
process.ErrorDataReceived += (s, e) =>
{
string line = e.Data;
//process stderr lines
};
process.OutputDataReceived += (s, e) =>
{
string line = e.Data;
//process stdout lines
};
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
}
不,它是缓冲的。但是错过最后一行可能会令人担忧。我认为Hans的意思是你的while循环中有一个bug。如果stdout被缓冲并且进程退出,则任何未读的缓冲行都可能丢失。只需删除冗余检查即可!进程已退出。ReadLine仅在流关闭(通过退出进程)且缓冲区清空后返回null。否,它已被缓冲。但是错过最后一行可能会令人担忧。我认为Hans的意思是你的while循环中有一个bug。如果stdout被缓冲并且进程退出,则任何未读的缓冲行都可能丢失。只需删除冗余检查即可!进程已退出。ReadLine仅在流关闭(由退出进程关闭)且缓冲区清空后返回null。