Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当使用System.Diagnostic Process时,我是否会错过进程开始和捕获输出开始之间的一些输出行?_C#_Parsing_Process_System.diagnostics - Fatal编程技术网

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。