0

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

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

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

4

3 回答 3

3

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

幸运的是,在 .NET 中,支持异步事件的 Socket 类稍微简化了这一点,以通知您在套接字上已完成挂起的操作。AsyncSocketEventArgs的MSDN 文档有一个不错的示例。

有关更多信息,请查看 CodeProject.com 上的C# Sockets Async Events

于 2012-04-27T01:22:11.183 回答
1

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

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

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

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

于 2012-04-27T08:37:43.937 回答
0

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

你可以在这里找到一个例子

于 2012-04-27T01:27:50.447 回答