gpt4 book ai didi

c# - 仅在 Windows XP 上异步接收的 UdpClient 异常

转载 作者:行者123 更新时间:2023-11-30 22:19:22 25 4
gpt4 key购买 nike

我有一个 c# 代码,它在 Windows vista/seven 中运行良好,但在 Windows XP 上运行不佳。

有问题的部分是“多播”节点,它基本上通过多播地址+端口读取和发送数据。

读取/写入网络的部分是单例。

访问此单例的每个线程都必须指示它们何时需要开始监听以及何时停止。

当至少一个线程需要“启动”时,Socket 被监听,当所有线程“停止”时我们停止(它们必须提供一个 Guid token ,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 on deployment but not on development machine)。

有没有办法避免这种行为?因为在我的情况下,通常我创建一个将在执行结束之前结束的线程,并且我不想释放它的套接字?

如果不可能,您将如何处理?

最佳答案

异步操作的调用线程在操作完成之前终止。

异步 ​​I/O 操作使用称为 IOCP(I/O 完成端口)的机制在 I/O 操作结束时通知执行线程。

在幕后,整个事情都基于一种叫做 Overlapped I/O 的东西。在 Windows Vista 中,重叠 I/O 的行为已更改,因此当调用线程中止时,I/O 操作不再被取消。

在 Windows Vista(例如 XP)之前,每当调用线程中止时,该线程发起的任何重叠 I/O 都会被取消,这可能就是导致此异常的原因。

您可以在这里阅读更多相关信息:http://www.lenholgate.com/blog/2008/02/major-vista-overlapped-io-change.html

您无法覆盖此行为,但您可以确保(例如,使用事件)您不会尝试使用创建线程不再处于事件状态的任何 I/O 资源。

关于c# - 仅在 Windows XP 上异步接收的 UdpClient 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com