プロセスを起動し、受信したデータを報告し、プロセスが終了するとプロセスを再開するChildProcessMonitorクラスがあります。私の問題は、プロセスが終了してStartが再度呼び出されると、出力が報告されなくなることです。
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
namespace WcfClient
{
/// <summary>
/// Can be used to launch and monitor (restart on crash) the child process.
/// </summary>
public class ChildProcessMonitor
{
private Process _process;
/// <summary>
/// Starts and monitors the child process.
/// </summary>
/// <param name="fullProcessPath">The full executable process path.</param>
public void StartAndMonitor(string fullProcessPath)
{
StartAndMonitor(fullProcessPath, null);
}
/// <summary>
/// Starts and monitors the child process.
/// </summary>
/// <param name="fullProcessPath">The full executable process path.</param>
/// <param name="arguments">The process arguments.</param>
public void StartAndMonitor(string fullProcessPath, string arguments)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = fullProcessPath,
WorkingDirectory = Path.GetDirectoryName(fullProcessPath) ?? string.Empty,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
processStartInfo.Arguments = arguments;
_process = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true };
_process.OutputDataReceived += OnOutputDataReceived;
_process.ErrorDataReceived += OnErrorDataReceived;
_process.Start();
_process.BeginOutputReadLine();
_process.BeginErrorReadLine();
_process.Exited += OnProcessExited;
}
/// <summary>
/// Called when process exits.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void OnProcessExited(object sender, EventArgs e)
{
if (_process != null)
{
Thread.Sleep(2000);
_process.Start();
}
}
/// <summary>
/// The ErrorDataReceived event indicates that the associated process has written to its redirected StandardError stream.
/// </summary>
public DataReceivedEventHandler ErrorDataReceived;
/// <summary>
/// Called when error data received.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="System.Diagnostics.DataReceivedEventArgs"/> instance containing the event data.</param>
private void OnErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Trace.WriteLine("Error data.");
if (ErrorDataReceived != null)
{
ErrorDataReceived(sender, e);
}
}
/// <summary>
/// The OutputDataReceived event indicates that the associated Process has written to its redirected StandardOutput stream.
/// </summary>
public DataReceivedEventHandler OutputDataReceived;
/// <summary>
/// Called when output data received.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="System.Diagnostics.DataReceivedEventArgs"/> instance containing the event data.</param>
private void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
{
Trace.WriteLine("Output data.");
if (OutputDataReceived != null)
{
OutputDataReceived(sender, e);
}
}
}
}