从c控制台应用程序阅读StdOut Asynch

时间:2010-09-09 19:27:46

标签: c# c process console asynchronous

我有一个基于控制台的c应用程序。 我正在使用重定向标准输出静默地从c#执行它并同步执行它工作正常。 现在我想以异步方式进行,它提供类似同步方式的输出。 即 OutPutDataRecieved事件被触发但仅在控制台应用程序(exe)完成后触发.OutputDataRecieved事件在完成后为每一行触发,而不是在输出中获得一行时立即触发。

asynch的代码适用于CMD.exe等,所以,我确信它的基于c的应用程序在输出方面有问题。 仅供参考:c控制台中的输出是使用printf完成的。 根据我的发现:  我认为c控制台应用程序在完成执行之前不会向stdout提供输出/写入。 我尝试将缓冲区设置为null或在每个printf之后刷新但没有效果。

任何技巧??

2 个答案:

答案 0 :(得分:2)

谢谢man.That就像一个魅力。

我正在使用setbuf来设置缓冲区null。

非常感谢所有人的努力。

有关其他guyz的信息,这是我的c#代码,可以在互联网论坛上找到。

        string command = @"Output.exe"; 
  string arguments = "hellotext"; 

  ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

  // Redirect the standard output of the process.  
  info.RedirectStandardOutput = true; 
  info.RedirectStandardError = true; 

  // Set UseShellExecute to false for redirection 
  info.UseShellExecute = false; 

  Process proc = new Process(); 
  proc.StartInfo = info; 
  proc.EnableRaisingEvents = true; 

  // Set our event handler to asynchronously read the sort output. 
  proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
  proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
  proc.Exited += new EventHandler(proc_Exited); 

  proc.Start(); 
  // Start the asynchronous read of the sort output stream. Note this line! 
  proc.BeginOutputReadLine(); 
  proc.BeginErrorReadLine(); 

  proc.WaitForExit(); 

  Console.WriteLine("Exited (Main)"); 

} 

static void proc_Exited(object sender, EventArgs e) 
{ 

  Console.WriteLine("Exited (Event)"); 
} 



static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
  Console.WriteLine("Error: {0}", e.Data); 
} 



static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
  Console.WriteLine("Output data: {0}", e.Data); 
} 

答案 1 :(得分:1)

您可以使用setvbuf禁用缓冲。

这是一个简单的示例,如果您删除对setvbuf的调用,则只有在按Enter键(等待getchar())后才会写入重定向的内容。使用setvbuf,字符串将直接写入重定向流。

int _tmain(int argc, _TCHAR* argv[])
{
  setvbuf(stdout, NULL,_IONBF, 0);
  printf("Hello");
  getchar();
  return 0;
}