Как мне узнать, когда прибыл последний объект OutputDataReceived?

У меня есть объект 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 было последним событием, которое я получаю.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
0
8 587
2

Ответы 2

Ответ на это: e.Data будет установлен на null:

static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
     if ( e.Data == null ) _exited.Set();
}

Будет удобнее, если для e.Data установлено значение null, но на самом деле значение будет пустой строкой. Обратите внимание, что первое значение также может быть пустой строкой. Настоящий ответ - как только вы получите какое-либо значение, отличное от Пустой строки, найдите следующую Пустую строку. Я использую Visual Studio 2019.

Другие вопросы по теме