2010-10-29 46 views
0

我打开一个System.Diagnostic.Process从一个进程读取标准输出,我希望能够在经过一段时间后中断它。如何中断一个IO绑定线程

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

由于线程在ReadToEnd()方法中,所以不起作用。我试图关闭从主线程的流,希望EOF的Read方法,但也没有工作。

+0

你是说你想为'ReadToEnd'指定某种超时,所以你基本上“读取结束,或者直到30秒”或类似的东西? – 2010-10-29 01:19:14

+0

是的,就是这样。 – Novikov 2010-10-29 01:30:36

回答

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

哎呦。由于我正在阅读标准,我将其命名为输出。看门狗正是我所拥有的,但它不起作用。 (主题)线程).Abort();}返回页首返回页首返回页首返回页首返回页首返回页首返回页首返回页首返回页首 } }' – Novikov 2010-10-29 01:28:34

0

您可以尝试在Process对象上以及在流上调用Dispose()。我想outputStream通过Process.StandardOutput链接到Process实例,所以这应该有所需的效果。

编辑 - 请参阅我对this question的回答 - .net I/O的这个区域容易发生死锁,如果这是一个选项,则更喜欢异步I/O。