【问题标题】:How to interrupt an IO bound thread如何中断 IO 绑定线程
【发布时间】:2010-10-29 01:11:57
【问题描述】:

我正在打开 System.Diagnostic.Process 以从进程中读取标准输出,并且我希望能够在经过一定时间后中断它。

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

这不起作用,因为线程在 ReadToEnd() 方法中。我试图从主线程关闭流,希望 EOF 是 Read 方法,但这也不起作用。

【问题讨论】:

  • 你是说你想为ReadToEnd 指定某种超时,这样你就基本上“读到结束,或者直到 30 秒过去”或类似的东西?

标签: .net multithreading streamreader system.diagnostics


【解决方案1】:

我会冒险堕胎

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,线程被成功中断。

顺便问一下,您的流应该是输入流吗?您不应该读取输出流...

【讨论】:

  • 哎呀。由于我正在阅读标准,因此我将其命名为输出。看门狗正是我所拥有的,但它不起作用。 static void doExit(object o) { foreach (object thread in threads) { ((Thread)thread).Abort(); } }
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2010-10-07
    • 1970-01-01
    • 2014-01-02
    • 2014-01-08
    相关资源
    最近更新 更多