如何中断IO绑定线程

时间:2010-10-29 01:11:57

标签: .net multithreading streamreader system.diagnostics

我正在打开一个System.Diagnostic.Process来从一个进程中读取stdout,我希望能够在经过一段时间后中断它。

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

由于线程在ReadToEnd()方法中,因此不起作用。我试图从主线程关闭流,希望'EOF读取方法,但这也不起作用。

2 个答案:

答案 0 :(得分: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并且线程被成功中断。

顺便说一句,您的信息流应该是输入信息流吗?你不应该读取输出流...

答案 1 :(得分:0)

您可以尝试在Dispose()对象和流上调用Process。我想outputStream通过Process链接到Process.StandardOutput实例,所以这应该会产生预期效果。

编辑 - 请参阅我对this question的回答 - .Net I / O的这个区域容易出现死锁,如果可以选择异步I / O,则更喜欢。