C # Shell - перенаправление ввода-вывода

Я пишу заменяющую оболочку Windows на C #, и функция, которую я сейчас реализую, заключается в том, чтобы все операции ввода-вывода были в одном и том же окне оболочки, т. Е. Не открывать 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 слова:

screenshot

 Fredrik Mörk30 июн. 2009 г., 00:22
Как выглядит код, запускающий процесс?
 Lucas Jones30 июн. 2009 г., 00:24
Я сейчас обновлю вопрос

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

Решение Вопроса

что вы хотите? Потому что кажется, что цикл выполняется настолько быстро, насколько это возможно, вызывая все больше и больше BeginOutputReadLine (потому что вызов возвращается немедленно, до того, как он завершен, и цикл возвращается для другой итерации, ion).

Вы можете вызвать ReadLine в потоке StandardOutput для синхронного решения. Или

    while ( !p.HasExited ) {
        /* ... - irrelevant */
        if ( redirect && !busy ) {
            try {
                busy = true;
                p.BeginOutputReadLine();
            } catch { }
        }
    }
   ////In the method that gets called upon completion of BeginOutputReadLine
   busy = false;

Помните об этом (из MSDN):

При запуске асинхронных операций чтения обработчик события называетсякаждый ра связанный процесс записывает строку текста в свой поток StandardOutput.

Вы можете отменить асинхронную операцию чтения, вызвав метод CancelOutputRead. Операция чтения может быть отменена вызывающей стороной или обработчиком события. После отмены вы можете снова вызвать BeginOutputReadLine для возобновления асинхронных операций чтения.

Это заставляет меня думать, что вы должны вызывать этот метод только один раз, и он будет уведомлять вас через обратный вызов, когда будет написана строка.

 colithium30 июн. 2009 г., 09:25
Похоже, его нужно вызывать только один раз с делегатом вашего метода, который что-то делает, когда выводится строка. Он будет продолжать вызывать этот метод после его настройки каждый раз, когда выводится новая строка.
 Fredrik Mörk30 июн. 2009 г., 00:29
Я считаю, что это тоже проблема; это просто пришло мне в голову, но вы уже написали это для меня
 Lucas Jones30 июн. 2009 г., 19:07
Хорошо, я сейчас в сети, поэтому попробую. Благодарность
 Lucas Jones30 июн. 2009 г., 00:31
(Не в этом вопросе, извините!) Мне нужно вспомнить, что находится в сети, а что нет.
 Lucas Jones30 июн. 2009 г., 00:30
Это примерно то, что я пытался, кроме как из try..catch - я добавлю это. MSDN пытается сказать, что вам нужно вызвать BeginOutputReadLine только один раз? Или его нужно возобновлять после каждой строки?

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