当前位置:  开发笔记 > 运维 > 正文

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

如何解决《c#无法访问已处置的对象》经验,为你挑选了1个好方法。

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

我将服务器套接字设置为侦听,并设置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);

任何评论仍然欢迎.



1> Jason Willia..:

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

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

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

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

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有