Process.Start () se bloquea cuando se ejecuta en un subproceso en segundo plano

He estado solucionando problemas todo el día. Despues de hacer algoinvestigación y muchas pruebas y errores, parece que he podido reducir el problema al hecho de que mi llamada aprocess.Start() no funciona en un hilo temporizador. El siguiente código funciona cuando se ejecuta en el hilo principal. Ponga exactamente el mismo código en una devolución de llamada de temporizador, y se bloquea. ¿Por qué? ¿Cómo consigo que funcione con un temporizador?

private static void RunProcess()
{
    var process = new Process();

    process.StartInfo.FileName = "cmd";
    process.StartInfo.Arguments = "/c exit";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardOutput = true;

    process.Start();  // code hangs here, when running on background thread

    process.StandardOutput.ReadToEnd();

    process.WaitForExit();
}

EDITAR

Como prueba, utilicé este mismo código exacto en otra computadora portátil y experimenté el mismo problema. Este es un código completo que se puede pegar en una aplicación de consola.process.Start() Se cuelga, pero tan pronto como presiono cualquier tecla para terminar,process.Start() Se completa antes de que finalice el programa.

private static System.Timers.Timer _timer;
private static readonly object _locker = new object();

static void Main(string[] args)
{
    ProcessTest();

    Console.WriteLine("Press any key to end.");
    Console.ReadKey();
}
private static void ProcessTest()
{
    Initialize();
}
private static void Initialize()
{
    int timerInterval = 2000;
    _timer = new System.Timers.Timer(timerInterval);
    _timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
    _timer.Start();
}
private static void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
    if (!Monitor.TryEnter(_locker)) { return; }  // Don't let  multiple threads in here at the same time.
    try
    {
        RunProcess();
    }
    finally
    {
        Monitor.Exit(_locker);
    }
}
private static void RunProcess()
{
    var process = new Process();
    process.StartInfo.FileName = "cmd";
    process.StartInfo.Arguments = "/c exit";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.Start();  // ** HANGS HERE **
    process.StandardOutput.ReadToEnd();
    process.WaitForExit();
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta