有没有办法在不关闭套接字的情况下释放套接字上阻塞的线程

本文关键字:套接字 释放 线程 情况下 有没有 | 更新日期: 2023-09-27 18:32:20

我有一个线程,它不断地阻塞在套接字上,读取所有内容,然后再次阻塞,等待更多。它是异步通信协议的一部分,负责获取响应并将其分发给发出请求的各种线程/窗口。它还处理响应"还活着?",超时消息等。我正在寻找一种通过方法调用关闭此循环的方法,基本上是为了释放套接字以进行一些手动干预,以防我需要它。

我曾经被告知要解锁正在套接字上等待的线程的方式是在套接字上放置其他称为 Close 的东西,尽管我不想这样做,但我宁愿让它保持打开状态。我过去处理这个问题的笨拙方法是关闭套接字上的阻塞,让它休眠一段时间,或者设置套接字超时以保持循环,但这两种都是一种轮询形式,我想避免这种情况。

也许有某种方法可以使用事件来做到这一点,当套接字为我提供一些数据时,是否有抛出的事件?

有没有办法在不关闭套接字的情况下释放套接字上阻塞的线程

不幸的是,异步 I/O 编程是最难正确完成的事情之一(在任何语言中)。在 Windows 中,典型的方法是使用称为 I/O 完成端口的东西。

幸运的是,在 .NET 中,Socket 类对此进行了一些简化,该类支持异步事件作为通知您套接字上挂起的操作已完成的一种方式。AsyncSocketEventArgs 的 MSDN 文档有一个很好的例子。

有关详细信息,请查看 CodeProject.com 上的 C# 套接字异步事件。

如果你想保持套接字打开,你为什么要中断等待数据的线程? 如果这个线程可以做其他事情以及等待他的套接字,你可以:

1) 使用"hEvent"等待句柄+WaitForMultipleObjects,完成例程或完整IOCP使用重叠的I/O。

2) 将所有非阻塞套接字活动移动到另一个线程,该线程在句柄数组上与 WFMO 一起等待,其中一个线程从仅执行阻塞读取的线程进行通信。

如果您真的必须取消阻止等待阻塞调用的一个线程而不关闭它,您可以安排让它发送一些数据。 将套接字上的回显请求发送到对等客户端/服务器。 然后它将回复,解锁等待它的 rx 线程。

您可以使用 Thread.Interrupt - 阻塞调用将返回需要处理的 ThreadInterruptedException。

您可以在此处找到示例