Как избежать застревания стандартного ввода в процессе c # - PullRequest
0 голосов
/ 18 июля 2011

Я пишу программу для проверки правильности кода отправки.Вот мой код ...

Process submitProg;
StreamWriter progInput;
string input;//it will be submitProg's standard input

//initialization
//...

submitProg.Start();
progInput = submitProg.StandardInput;
progInput.Write("{0}",input);
progInput.Close();
progInput.Dispose();


while(!submitProg.HasExited)
    if(timeOUT)
        submitProg.Kill();

Удивительно, но он застрянет в строке progInput.Write("{0}",input);, пока ввод достаточно велик, а программа отправки ничего не прочитала.

Некоторый код отправки может быть хитрым, как while(1); ничего не делать.Я могу убить процесс, когда входной файл достаточно мал.Напротив, если входной файл больше, программа не будет проверять время ожидания и застревает при чтении ввода.

Есть ли у меня какое-либо решение, чтобы не застрять в коде, который ничего не читает,Благодаря.

1 Ответ

0 голосов
/ 18 июля 2011

Вы зависите от размера стандартного входного буфера и программы, которую вы тестируете. Если он не читает свой буфер, ваша запись на стандартный ввод может блокироваться.

Одним из способов избежать этой проблемы является запись в стандартный поток ввода в другом потоке, например в потоке ThreadPool. Просто поместите строки Write, Close, Dispose в задачу ThreadPool и используйте ThreadPool.QueueUserWorkItem.

В качестве примечания вам, вероятно, не нужно вызывать progInput.Close и ProgInput.Dispose. Вызов Dispose должен быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...