Я пишу замену оболочки Windows на С#, и функция, которую я в настоящее время реализую, имеет все IO внутри одного окна оболочки, то есть не открывает cmd.exe в другом окне.
Сейчас у меня есть частичное решение для вывода. Это мой код (где p - текущий процесс):
while ( !p.HasExited ) {
    /* ... - irrelevant */
    if ( redirect ) {
        try {
            p.BeginOutputReadLine();
        } catch { }
    }
}
Процесс настраивается со всеми правильными свойствами, такими как UseShellExecute= False, RedirectStandard{Input, Output, Error}= True, и обработчики событий настроены правильно, но они несовместимы.
Я попытался вынуть try/catch (который, как я знаю, очень плохая практика), и используя занятый bool, который установлен на false при запуске обработчика, но по какой-то причине я все еще получаю InvalidOperationException на p.BeginOutputReadLine() - заявив, что уже выполняется асинхронная работа.
Любая помощь будет оценена, даже если для этого требуется совершенно другое решение выше, а не просто ее исправление.
Спасибо.
EDIT. Вот код, который запускает процесс:
if (redirect)
{
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.UseShellExecute = false;
    p.OutputDataReceived += new DataReceivedEventHandler(redirectHandler_StdOut);
    p.ErrorDataReceived += new DataReceivedEventHandler(redirectHandler_StdErr);
}
p.Start();
Кроме того, я понял, что не объясняю, что я имею в виду под непоследовательностью. Как говорится, картина стоит 2^3 слов:
 
