I have a ChildProcessMonitor class that launches my process, reports data received and restarts the process when it exits. My problem is that once the process exits and Start is called again, output is no longer reported.
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);
}
}
}
}
Try use:
ps
Short description: OutputRead & ErrorRead closed with process restarting.
Long description with code from reflection: