c#无法访问已处置的对象

时间:2010-01-09 19:12:47

标签: .net object dispose

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

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

消息“无法访问已命名的已处置对象 “System.Net.Sockets.Socket”。 对象名:“System.Net.Sockets.Socket”。“String

在我看来,就是这样:“我打电话时插座 Socket.Close()方法,但回调没有在之前发布 插座关闭。“

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

我的问题我如何处理这个除外?需要进行哪些处理?

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

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

仍然欢迎任何评论。

1 个答案:

答案 0 :(得分:6)

如果您不关心异常(即它不是“异常”,这是正常的操作过程并且每次都发生),您可以忽略/禁止它。 (只要在指示真正错误的情况下不会发生这种情况)

如果你想更加整洁地压缩它,那么你可以设置一个标志,告诉你的回调它应该关闭,并让回调实际上关闭/处理套接字。这样你就可以保证套接字上没有挂起的读取并且不会得到异常(但这意味着它将无限期地挂起,直到收到另一个数据包 - 这当然可能永远不会发生)。

如果你控制通信链接的两端,那么你可以发送一个明确的“关闭”消息,告诉客户端应该关闭连接(这当然可以在消息回调中应用)收到)。

(但我很想知道是否有其他人找到了更好的解决方案,因为我遇到类似UDP通信实施的情况)