我正在打开一个 System.Diagnostic.Process 以从进程中读取标准输出,并且我希望能够在经过一定时间后中断它。
try
{
output = outputStream.ReadToEnd();
}
catch (ThreadInterruptedException e)
{
return;
}
这不起作用,因为线程在 ReadToEnd() 方法中。我试图从主线程关闭流,希望 EOF 是 Read 方法,但这也不起作用。
我正在打开一个 System.Diagnostic.Process 以从进程中读取标准输出,并且我希望能够在经过一定时间后中断它。
try
{
output = outputStream.ReadToEnd();
}
catch (ThreadInterruptedException e)
{
return;
}
这不起作用,因为线程在 ReadToEnd() 方法中。我试图从主线程关闭流,希望 EOF 是 Read 方法,但这也不起作用。
我会冒险堕胎
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 并且线程成功中断。
顺便说一句,您的流应该是输入流吗?您不应该读取输出流...
您可以尝试调用Dispose()
对象Process
以及流。我想通过outputStream
链接到Process
实例,Process.StandardOutput
所以这应该有预期的效果。
编辑 - 请参阅我对这个问题的回答- .Net I/O 的这个区域很容易出现死锁,如果可以的话,更喜欢异步 I/O。