Подтвердить что ты не робот

Как узнать, когда прибыл последний выход DataDataReceived?

У меня есть объект System.Diagnostics.Process в программе, нацеленной на .Net framework 3.5

Я перенаправил как теги StandardOutput, так и StandardError, и я получаю данные от них асинхронно. Я также установил обработчик событий для события Exited.

Как только я звоню Process.Start(), я хочу уйти и сделать другую работу, пока жду событий.

К сожалению, похоже, что для процесса, который возвращает большой объем информации, событие Exited запускается перед последним событием OutputDataReceived.

Как узнать, когда был получен последний OutputDataReceived? В идеале я хотел бы, чтобы событие Exited было последним событием, которое я получаю.

Вот пример программы:

using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
  class Program
  {

    static void Main(string[] args)
    {
      string command = "output.exe";
      string arguments = " whatever";

      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);
    }


  }
}

При запуске этой программы вы заметите, что "Exited (Event)" появляется в полностью переменном месте на выходе. Возможно, вам придется запустить его несколько раз, и, очевидно, вам нужно будет заменить "output.exe" на вашу программу, которая производит достаточно большой объем вывода.

Итак, вопрос снова: как узнать, когда был получен последний OutputDataReceived? В идеале я хотел бы, чтобы событие Exited было последним событием, которое я получаю.

4b9b3361