2010-10-29 3 views
0

Я открываю System.Diagnostic.Process для чтения stdout из процесса, и я хотел бы иметь возможность прервать его после определенного истекшего времени.Как прервать связанный поток IO

try 
{ 
    output = outputStream.ReadToEnd(); 
} 
catch (ThreadInterruptedException e) 
{ 
    return; 
} 

Это не работает, поскольку поток находится в методе ReadToEnd(). Я попытался закрыть поток из основного потока, надеясь, что EOF метод Read, но это тоже не сработало.

+0

Вы хотите указать какой-то тайм-аут для 'ReadToEnd', чтобы вы в основном« читали до конца или до истечения 30 секунд »или что-то в этом роде? –

+0

Да, это именно оно. – Novikov

ответ

0

рискну прерывание

try 
{ 
    Timer watchdog = new Timer(abortMe, Thread.CurrentThread, timeout, Timeout.Infinite); 
    output = outputStream.ReadToEnd(); 
    watchdog.Dispose(); 
} 
catch (ThreadAbortException e) 
{ 
    return; 
} 

private void abortMe(object state) 
{ 
    ((Thread)state).Abort() 
} 

На самом деле мне удалось закрыть поток, когда я работаю с TCP и UDP сокетов: это вызывает SocketException и поток получает успешно прерывается.

Кстати, должен ли ваш поток быть ввод поток? Вы не должны читать выходной поток ...

+0

кричит. Поскольку я читаю стандарт, я назвал его выходным. Наблюдатель - это именно то, что у меня есть, но оно не работает. 'static void doExit (объект o) { foreach (объектная нить в потоках) { ((Thread) thread) .Abort(); } } ' – Novikov

0

Вы можете попробовать позвонить Dispose() на объект Process, а также на поток. Я полагаю, что outputStream связан с экземпляром Process через Process.StandardOutput, поэтому это должно иметь желаемый эффект.

EDIT - см. Мой ответ this question - эта область .Net ввода-вывода подвержена взаимоблокировке, предпочитает асинхронный ввод-вывод, если это опция.

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