24

.Net Framework 3.5 を対象としたプログラムに System.Diagnostics.Process オブジェクトがあります。

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理想的には、このイベントを受信する最後のイベントにしたいと考えています。

4

2 に答える 2

29

これに対する答えは、次のe.Dataように設定されnullます。

static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
     if( e.Data == null ) _exited.Set();
}
于 2009-09-14T20:13:57.310 に答える