2010-01-09 124 views
7

我正在制作一个服务器/客户端应用程序。c#无法访问处置对象

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

消息“无法访问名为释放的对象 ‘System.Net.Sockets.Socket’ 对象名称:‘System.Net.Sockets.Socket’ “。字符串

在我看来,这仅仅是这样的:“当我打电话 Socket.Close()方法,但回调并没有公布设置在插座前 插座关闭。”

我没有在网上搜索,发现这不是错误,但是一个设计例外,因为beginaccept被取消。

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

我只是把它当作一个正常的事件:

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

任何意见,仍然欢迎。

+0

确定查看了代码,是的,我可以肯定,通过处理它作为友好的消息不会使应用程序失败。 谢谢。 – iTEgg 2010-01-09 20:34:16

+0

也许重新把你的问题归咎于TcpListener或套接字? – 2010-11-27 12:07:58

回答

6

如果你不关心异常(即它不是一个“例外”,这是正常的工作程序,发生的每一次),你可以忽略/镇压。 (只要它不会发生在表明一个真正的错误的情况下)

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

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

(但我喜欢听到的话,任何人都已经找到了更好的解决方案,因为我有一个UDP通讯科实施了类似的情况)

+0

(只要它不会发生在表明一个真正的错误的情况下) - >是的,我不能确定这一点。我也有兴趣了解更多关于他人的观点。是的,即时通讯在这种情况下写客户端和服务器。即时通讯总是为了整洁的代码,而不是只是工作的代码。 – iTEgg 2010-01-09 20:11:09

相关问题