求救:异步Socket偶尔出现System.ArgumentException异常,何解?

JZ_7975 2014-08-12 11:20:53
用户测试时发现Socket异常:
[2014-8-12 22:23:39] [ERROR]		System.ArgumentException: The IAsyncResult object was not returned from the corresponding asynchronous method on this class.
Parameter name: asyncResult
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult, SocketError& errorCode)
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at GSFTCollectionService.BLL.SocketServer.ReadCallback(IAsyncResult ar) in

系统使用的异步Socket,异常指向的错误行数是:var bytesRead = Handler.EndReceive(ar);

public static void ReadCallback(IAsyncResult ar)
{
//缓冲区大小
StateObject state = null;
var sb = new StringBuilder();
byte[] reciveData;
ModuleSocketInfo msi;
//线程使用
SocketActivateCertification socketActivateCertification;
SocketHeartbeat socketHeartbeat;
SocketUpdateIP socketUpdateIP;
SocketTakingPictures socketTakingPictures;
SocketFile socketFile;
Thread t;
try
{
state = (StateObject)ar.AsyncState;
Handler = state.workSocket;
var moduleIp = Handler.RemoteEndPoint.ToString();//终端IP
//客户端发送数据的长度
var bytesRead = Handler.EndReceive(ar);


这个异常,并不是每次都会出现,请问是什么原因造成的?
...全文
455 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
JZ_7975 2014-08-17
  • 打赏
  • 举报
回复
引用 7 楼 xiaozhi_5638 的回复:
[quote=引用 6 楼 JZ_7975 的回复:] [quote=引用 3 楼 xiaozhi_5638 的回复:] 出现这个异常的原因是 你正在进行异步读取数据的时候 有人(或者自动)关闭了socket(socket.Close())
我仔细看了日志,硬件设备在发送文件的过程中和服务端断开了连接 然后就导致抛出了System.ArgumentException异常。 另外,非常感谢讲解了EndInvoke方法的作用 [/quote] 所以原因还是: 正在异步接收数据的时候 socket却断开了 try/catch一下 认为掉线了[/quote] 加了try catch,捕获System.ArgumentException
请叫我卷福 2014-08-14
  • 打赏
  • 举报
回复
引用 6 楼 JZ_7975 的回复:
[quote=引用 3 楼 xiaozhi_5638 的回复:] 出现这个异常的原因是 你正在进行异步读取数据的时候 有人(或者自动)关闭了socket(socket.Close())
我仔细看了日志,硬件设备在发送文件的过程中和服务端断开了连接 然后就导致抛出了System.ArgumentException异常。 另外,非常感谢讲解了EndInvoke方法的作用 [/quote] 所以原因还是: 正在异步接收数据的时候 socket却断开了 try/catch一下 认为掉线了
JZ_7975 2014-08-13
  • 打赏
  • 举报
回复
引用 3 楼 xiaozhi_5638 的回复:
出现这个异常的原因是 你正在进行异步读取数据的时候 有人(或者自动)关闭了socket(socket.Close())
我仔细看了日志,硬件设备在发送文件的过程中和服务端断开了连接 然后就导致抛出了System.ArgumentException异常。 另外,非常感谢讲解了EndInvoke方法的作用
请叫我卷福 2014-08-13
  • 打赏
  • 举报
回复
EndInvoke方法(或者其他以End+开头的方法)的作用: 1)该方法返回,才证明异步过程完成; 2)异步过程中有异常,可以通过该方法捕获。 该方法是我们了解“异步调用”进度/进展 的途径
请叫我卷福 2014-08-13
  • 打赏
  • 举报
回复
在 System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(Message reqMsg, Boolean bProxyCase) 在 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(Object NotUsed, MessageData& msgData) 在 System.Action.EndInvoke(IAsyncResult result) 以上是异常信息 指明异常来自Action.EndInvoke
请叫我卷福 2014-08-13
  • 打赏
  • 举报
回复
出现这个异常的原因是 你正在进行异步读取数据的时候 有人(或者自动)关闭了socket(socket.Close())

在异步编程中,大多数异常都由End结尾的方法抛出 也就是说 你的EndReceive、EndInvoke、EndSend等方法必须放在try/catch块中 你代码抛出那样的异常 很可能客户端关闭了socket 做一下处理就可以 比如认为对方断线了


使用委托异步编程时,如果我们调用的方法有异常,那么会在我们调用EndInvoke时抛出


上面图中 Test类 在另外一个单独的dll中,源码为:
class Test
{
public static void DoSomething()
{
int b=0;
int a = 100/b;
}
}



由此可以看出,异步过程出现的异常 全部会在我们调用EndInvoke方法时抛出
JZ_7975 2014-08-13
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
http://social.msdn.microsoft.com/Forums/en-US/d2e8a000-9707-44b6-8fb4-a0a9f3ae0a1a/iasyncresult-object-was-not-returned-from-the-corresponding-asynchronous-method?forum=netfxnetcom
有个地方不明白,这个判断中的currentAynchResult,从哪来的呢? if (ar == currentAynchResult)
devmiao 2014-08-12
  • 打赏
  • 举报
回复
http://social.msdn.microsoft.com/Forums/en-US/d2e8a000-9707-44b6-8fb4-a0a9f3ae0a1a/iasyncresult-object-was-not-returned-from-the-corresponding-asynchronous-method?forum=netfxnetcom

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧