2015-01-26 2 views
0

Это действительно вопрос о потоках, но я прошу конкретно решить мою текущую проблему с процессами.Process.StandardOutput поток к событиям

System.Diagnostics.Process предоставляет StandardOutput как поток. Я хочу слушать этот поток и обрабатывать его вывод за строкой. Очевидно, что нет прямой корреляции между входом и выходом, но давайте добавим немного искусственное требование, чтобы мы могли обрабатывать вывод «по строке».

Так что большинство примеров использования его выглядеть следующим образом:

using (Process process = Process.Start(start)) 
{ 
    // 
    // Read in all the text from the process with the StreamReader. 
    // 
    using (StreamReader reader = process.StandardOutput) 
    { 
    string result = reader.ReadToEnd(); 
    Console.Write(result); 
    } 
} 

Который не имеет смысла, поскольку это не событийная и предполагает, что процесс живет достаточно долго, чтобы вернуть некоторые результаты. По событию, это не должно быть событие. Лямбда, обратный вызов, событие, что бы то ни было, я просто хочу получать уведомление, когда выводится целая строка, и я хочу, чтобы я смог завершить работу, когда закончил процесс.

По существу, я прошу только опросы потоков.

Благодаря

+4

Вы посмотрели 'Process.OutputDataReceived'? –

+0

Привет, Джон, просто отбросил назад, чтобы добавить комментарий, чтобы сказать, что я только что нашел OutputdataReceived. Есть ли ответ на обработку долгоживущего прерывистого потока, который не требует, чтобы он был полезным уведомляющим ... уведомлением? – Ian

+2

Не уверен, что вы имеете в виду, если быть честным. Непонятно, что вы ищете вне OutputDataReceived. Обратите внимание, что вы можете просто поместить свой цикл в отдельный поток ... –

ответ

1

Вы можете получить данные с помощью Process.OutputDataReceived события. Это может быть сложно использовать. Поиск переполнения стека для него, и вы найдете несколько проблем синхронизации и ловушек.

В общем, вам никогда не нужно опробовать поток данных. Насколько мне известно, на самом деле нет возможности опроса. Вы либо читаете синхронно, либо асинхронно. Ваш вызов будет завершен только тогда, когда будут данные или поток исчерпан.

В асинхронном случае вы можете просмотреть обратный вызов, который вы получаете как событие. Поэтому просто позвоните BeginReadLine, и это ваше мероприятие. Или делайте это с заданиями.

Смежные вопросы