Process.Start () зависает при работе в фоновом потоке

Устранение неполадок весь день. После некоторыхисследование и много проб и ошибок, кажется, ямы смогли сузить вопрос до того факта, что мой призыв кprocess.Start() Безразлично»работать в потоке таймера. Код ниже работает при запуске в главном потоке. Поместите тот же самый код в обратный вызов таймера, и он зависает. Зачем? Как мне заставить его работать с таймером?

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();
}

РЕДАКТИРОВАТЬ

В качестве теста я использовал точно такой же код на другом ноутбуке, и у меня возникла та же проблема. Это полный код, который можно вставить в консольное приложение.process.Start() зависает, но как только я нажимаю любую клавишу до конца,process.Start() завершается до окончания программы.

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();
}

Ответы на вопрос(1)

Ваш ответ на вопрос