C#无法访问已释放的对象。

7

我正在制作一个服务器/客户端应用程序。

我将服务器套接字设置为侦听,并设置BeginAccept()方法。 当我关闭服务器套接字(Socket.Close())以关闭服务器时, 从BeginAccept()方法的异步回调方法中抛出异常。 我检查了异常,并发现异常告诉我这个:

消息“无法访问名为 “System.Net.Sockets.Socket”的已处理对象。 对象名称:“System.Net.Sockets.Socket”。”字符串

在我看来,这只是这样的:“当我调用Socket.Close()方法时,套接字被处理,但在套接字关闭之前回调没有被释放。”

我在网上搜索并发现这不是一个错误,而是一个设计好的异常,因为beginaccept被取消了。

我的问题是如何处理这个异常?需要进行什么样的处理?

我只会将其视为正常事件:

      OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message);
      OnUpdateNetworkStatusMessage(this, eventArgs);

任何评论仍然受到欢迎。

好的,我已经查看了代码,可以确定通过将其处理为友好消息来处理不会使应用程序暴露于故障之中。谢谢。 - iTEgg
也许你可以重新命名你的问题,使其与TcpListener或Sockets相关? - Petrus Theron
1个回答

6
如果你不关心异常(即它不是一个“异常”,而是正常的操作流程,每次都会发生),那么你可以忽略/抑制它。(只要它不会在指示真正错误的情况下发生)
如果你想更整洁地抑制它,那么你可以设置一个标志,告诉你的回调函数应该关闭,并让回调函数实际上关闭/处理套接字。这样你就可以保证套接字上没有挂起的读取,并且不会收到异常(但这意味着它将无限期地挂起,直到收到另一个数据包 - 当然可能永远不会发生)。
如果你控制通信链路的两端,那么你可以发送一个明确的“关闭”消息,告诉客户端连接应该被关闭(当然,这可以在接收到消息时在回调函数中应用)。
(但我很想听听其他人是否找到了更好的解决方案,因为我有一个类似的UDP通信实现的情况)。

“只要不是在真正的错误情况下发生” - 是的,我不能确定这一点。我也很想了解其他人的意见。是的,在这种情况下我正在编写客户端和服务器。我总是倾向于整洁的代码而不是仅仅能工作的代码。 - iTEgg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接