C # Shell - przekierowanie IO

Piszę zastępczą powłokę Windows w C #, a funkcja, którą obecnie implementuję, ma wszystkie IO wewnątrz tego samego okna powłoki - tzn. Nie otwiera cmd.exe w innym oknie.

W tej chwili mam częściowe rozwiązanie wyjścia. To jest mój kod (gdzie p to działający proces):

while ( !p.HasExited ) {
    /* ... - irrelevant */
    if ( redirect ) {
        try {
            p.BeginOutputReadLine();
        } catch { }
    }
}

Proces jest skonfigurowany ze wszystkimi właściwymi właściwościami, takimi jakUseShellExecute = False, RedirectStandard{Input, Output, Error} = True, a moduły obsługi zdarzeń są skonfigurowane poprawnie, ale są niespójne.

Próbowałem wyjąć try / catch (co wiem, że jest to bardzo zła praktyka) i używając zajęty bool, który jest ustawiony na false, gdy działa obsługa, ale z jakiegoś powodu nadal otrzymuję InvalidOperationException na p.BeginOutputReadLine ( ) - stwierdzające, że działa już operacja asynchroniczna.

Każda pomoc zostanie doceniona, nawet jeśli wymaga zupełnie innego rozwiązania niż powyższe, a nie tylko jej naprawienia.

Dzięki.

EDYTOWAĆ: Oto kod, który rozpoczyna proces:

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

Również zdałem sobie sprawę, że nie tłumaczę tego, co rozumiem przez niekonsekwencję. Jak mówią, obraz jest wart2^3 słowa:

questionAnswers(1)

yourAnswerToTheQuestion