【问题标题】:How to close a blocked socket如何关闭阻塞的套接字
【发布时间】:2010-08-24 14:29:01
【问题描述】:

Windows 服务有一个打开的套接字正在接收数据(在单独的线程上)

为了响应OnShutdown 服务,我想通知工作线程关闭,但它目前在Receive 上被阻止。

目前我在Receive 上超时以检查是否有待处理的停止请求。有没有更好的方法,而不是等待超时通知工作线程停止接收并执行其关闭逻辑?

【问题讨论】:

  • 最好的方法是使用异步套接字。无论如何,它们的扩展性要好得多。
  • 在某种意义上它是异步的。当然,我没有使用 BeginReceive——但即使我使用了,我如何让该线程在等待数据时停止接收。

标签: .net multithreading sockets


【解决方案1】:

致电Socket.Close。它将导致Socket.Receive 方法抛出异常立即解除阻塞。

异常是一个 IO.IOException,它有一个 SocketException 作为内部异常。内部异常的原生错误码是10004。

【讨论】:

    【解决方案2】:

    在线程上调用 Interrupt() 应该使它脱离任何阻塞操作: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx

    请注意,这将导致ThreadInterruptedException(阻塞时),您应适当处理。

    【讨论】:

    • 那太好了,但似乎线程没有被 Socket.Receive 阻塞,以至于无法听到这个中断。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2015-07-30
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多