C#System.Diagnostics.Process重定向标准输出以获取大量数据

Mat*_*att 2 .net c# streamreader

我从.NET应用程序运行exe并尝试将标准重定向到streamreader.问题是,当我这样做

myprocess.exe >> out.txt

out.txt接近14mb.当我执行命令行版本时,它非常快,但是当我从我的csharp应用程序运行该进程时,它非常慢,因为我相信默认的streamreader每4096字节刷新一次.

有没有办法更改Process对象的默认流读取器?

spe*_*der 5

我没试过,但看起来异步方法可能会提供更好的性能.而不是使用process.StandardOutput,请尝试此方法:

Process process = Process
    .Start(new ProcessStartInfo("a.exe"){RedirectStandardOutput = true});
if (process != null)
{
    process.OutputDataReceived += ((sender, e) =>
                                   {
                                       string consoleLine = e.Data;
                                       //handle data
                                   });
    process.BeginOutputReadLine();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

编辑:刚刚意识到我回答了错误的问题。就我而言,标准输出缓冲区已满,并且 WaitForExit() 永远阻塞,因为尚未从缓冲区读取任何内容。因此,如果您遇到这个问题,那么这里有一个解决方案。;)

这是我第一天使用 C#,所以请理解这可能不是最好的解决方案,并且可能并不总是有效。但它在我测试过的 2x 中有效。;) 这是同步的,只需在 WaitForExit() 之前开始将重定向的 stdout/stderr 写入文件即可。这样,WaitForExit() 就不会阻塞等待标准输出缓冲区被清空。

      string str_MyProg = "my.exe";
      string str_CommandArgs = " arg1 arg2"'
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(str_MyProg, str_CommandArgs);

      procStartInfo.RedirectStandardError = true;
      procStartInfo.RedirectStandardOutput = true; // Set true to redirect the process stdout to the Process.StandardOutput StreamReader
      procStartInfo.UseShellExecute = false;
      procStartInfo.CreateNoWindow = true;          // Do not create the black window

      // Create a process, assign its ProcessStartInfo and start it
      System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
      myProcess.StartInfo = procStartInfo;
      myProcess.Start();

      // Dump the output to the log file
      string stdOut = myProcess.StandardOutput.ReadToEnd();
      StreamWriter logFile = new StreamWriter("output.txt" );
      logFile.Write(stdOut);
      logFile.Close();

      myProcess.WaitForExit();          
Run Code Online (Sandbox Code Playgroud)

  • 查看您的代码,特别是 StandardOutput 和 StandardError 的重定向,让我想起了 MSDN 上的此页面(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput%28v=vs. 71%29.aspx),他们描述了在这种情况下可能出现的死锁。另一方面,您没有阅读 StandardError 所以也许这不是问题。 (2认同)