【问题标题】:Aborting blocking thread中止阻塞线程
【发布时间】:2012-08-05 00:25:08
【问题描述】:

我有一个线程阻塞了 Networkstream Read 调用。我如何最好地中止这个线程?我尝试在另一个线程的线程上调用Thread.Abort,根据MSDN,它应该引发ThreadAbortException。但是,ThreadAbortException 根本没有在线程中引发。然而,当我删除阻塞的Read 调用并让线程处于循环中时。做这个的最好方式是什么?我可以同时等待Read 调用和一个事件,以便线程在其中任何一个发生时解除阻塞?然后我可以从另一个线程发出该事件的信号。

【问题讨论】:

  • 您好,您是否尝试过修改缓冲区大小以避免阻塞。在线程上使用循环和缓冲区大小允许您在需要时停止线程;-)
  • 一开始不屏蔽怎么样?

标签: .net multithreading


【解决方案1】:

关闭套接字!然后读取应该抛出异常。

【讨论】:

    【解决方案2】:

    Thread.Abort 仅在线程运行托管代码时中止,但您的线程正在非托管套接字上等待,因此在套接字解除阻塞之前什么都不会发生。

    关闭套接字是这里的最佳选择。

    【讨论】:

      【解决方案3】:

      设置

      stream.ReadTimeout = timeout; 
      // timeout in ms
      

      使用前

      stream.Read(....
      

      这将强制读取超时,并允许在指定的超时(以毫秒为单位)内没有读取任何内容时执行某些操作。请参阅 MSDN 上的 Stream::ReadTimeout Propertythis post。 通过这种方式,您可以实现仅在指定的 超时 内阻塞的读取。使用其他同步方法来确定是应该继续读取还是应该完成线程。超时会抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-04
        相关资源
        最近更新 更多