能否得知Socket.SendAsync的执行情况?

abcbuzhiming 2013-12-21 05:42:01
问题一,msdn里描述beginSend函数当系统缓冲区是满的情况下,会理解直接返回异常,SendAsync是等在那里直到发送完毕调用完成事件,还是也一样的立即返回异常?

问题二,除了等待SendAsync自己执行完毕后调用完毕事件方法外,没有其他办法知道本次操作是否结束了吗?这个问题很让让头大,设想一种应用环境,服务器需要经常的send消息,SendAsync每次都需要一个SocketAsyncEventArgs作为参数,在上次异步没有结束前,再次使用SocketAsyncEventArgs对象进行SendAsync就会报异常(SocketAsyncEventArgs处于使用中),你也不可能每次SendAsync都new一个SocketAsyncEventArgs对象,那会造成性能问题,所以用于发送的SocketAsyncEventArgs对象必须能重复使用。可现在似乎找不到什么办法知道SendAsync是否结束
...全文
347 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcl_009 2016-05-17
  • 打赏
  • 举报
回复
持续关注,同样求解
紫灬忄 2015-11-20
  • 打赏
  • 举报
回复
我就过来占个位
  • 打赏
  • 举报
回复
由于一些不恰当的宣传,有些人总是纠结于“是否new一个对象比较消耗内存”的问题,这有时候有可能是一种“担心天塌下来”的幼稚病在作怪。 对于.net平台系统来说,有着比较好的垃圾回收机制,那么许多方面的“内存”量你可以看成是“无限大”的,因为它会反复循环使用,因此绝对不会有任何内存容量问题。 那么剩下的就是速度问题。假设你为了“省下new对象的空间”而造成了程序逻辑问题,你就不得不使用一些运行低速的处理方法,例如你使用 Queue 或者加锁的机制来保证多线程安全地复用某些对象集合,其实你的程序再分配获取一个 SocketAsyncEventArgs 对象实例时比 new 一个新的对象实例慢了20倍。那么你现在还觉得“每次都new一个SocketAsyncEventArgs对象,那会造成性能问题”吗? 要想知道正确的结论,自己做测试,用数据说话。不要被一些博客上的说法所左右。
abcbuzhiming 2013-12-22
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
由于一些不恰当的宣传,有些人总是纠结于“是否new一个对象比较消耗内存”的问题,这有时候有可能是一种“担心天塌下来”的幼稚病在作怪。 对于.net平台系统来说,有着比较好的垃圾回收机制,那么许多方面的“内存”量你可以看成是“无限大”的,因为它会反复循环使用,因此绝对不会有任何内存容量问题。 那么剩下的就是速度问题。假设你为了“省下new对象的空间”而造成了程序逻辑问题,你就不得不使用一些运行低速的处理方法,例如你使用 Queue 或者加锁的机制来保证多线程安全地复用某些对象集合,其实你的程序再分配获取一个 SocketAsyncEventArgs 对象实例时比 new 一个新的对象实例慢了20倍。那么你现在还觉得“每次都new一个SocketAsyncEventArgs对象,那会造成性能问题”吗? 要想知道正确的结论,自己做测试,用数据说话。不要被一些博客上的说法所左右。
谢谢指点,我比较困惑就在于SocketAsyncEventArgs的msdn和网上范例,都是预先建立了一个stack,里面塞满了SocketAsyncEventArgs对象,每新连入一个连接,就为这个连接分配一个SocketAsyncEventArgs,当连接断开时,再把SocketAsyncEventArgs压回去,用这种方式来实现SocketAsyncEventArgs的重用,但是这个东西的弱点,在于单个SocketAsyncEventArgs,长时间处于ReceiveAsync的状态,不能完成当客户端未向服务器发送消息时,服务器需要主动推送消息的需求,此时要推送就必须自己新建SocketAsyncEventArgs。但是我还有个困惑是,如果网络比较繁忙,系统缓冲区未空闲的情况下,前一个SocketAsyncEventArgs的sendAsync还未完成,后一个SocketAsyncEventArgs开始sendAsync,那他们的消息谁会先发出?
  • 打赏
  • 举报
回复
事实上在99.9%的应用中,对于低级功能的那种网络上的貌似有理的“洁癖”式的说法,往往都是没有什么差别的。如果你在架构等方面稍微做一点调整,可以让性能提高几倍。而死抠这种“是不是要new一个对象”之类的代码,性能提高不足万分之一,而且花费了大量精力甚至写下来一大堆难以维护的代码。
  • 打赏
  • 举报
回复
你测试过“每次SendAsync都new一个SocketAsyncEventArgs对象,那会造成性能问题”了吗?造成多大的性能问题呢? 如果你喜欢“洁癖”,那么你可以使用一个 static Queue<SocketAsyncEventArgs> 用来重复使用 new 出来的这中对象,这样仅在必要的时候才 new 一个新的对象。并且Queue也是线程安全的。

110,535

社区成员

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

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

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