我的 ac# 代码在 Windows vista/7 中运行良好,但在 Windows XP 上却不行。
有问题的部分是“多播”节点,它基本上通过多播地址+端口读取和发送数据。
读取/写入网络的部分是单例。
每个访问这个单例的线程都必须指出它们何时需要开始监听,何时停止。
当至少一个线程需要“开始”时监听套接字,当所有线程“停止”时我们停止(他们必须给出一个 Guid 令牌,即 Start 方法返回)。
这种启动/停止机制是为了确保如果没有线程需要查看网络上发生的事情,我们不会为此消耗内存。
我遇到的问题是,在 Windows XP 上,我遇到了这个异常:
System.Net.Sockets.SocketException (0x80004005): The I/O operation has been aborted because of either a thread exit or an application request
at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
经过一番搜索,似乎在 Windows XP 及更低版本上,当线程结束时,操作系统会释放其所有 I/O 资源。(VB.NET 3.5 SocketException 在部署但不在开发机器上)。
有没有办法避免这种行为?因为在我的情况下,我创建一个在执行结束之前结束的线程是很正常的,而且我不想释放它的套接字?
如果不可能,您将如何处理?