当前位置:编程学习 > C#/ASP.NET >>

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

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

问题二,除了等待SendAsync自己执行完毕后调用完毕事件方法外,没有其他办法知道本次操作是否结束了吗?这个问题很让让头大,设想一种应用环境,服务器需要经常的send消息,SendAsync每次都需要一个SocketAsyncEventArgs作为参数,在上次异步没有结束前,再次使用SocketAsyncEventArgs对象进行SendAsync就会报异常(SocketAsyncEventArgs处于使用中),你也不可能每次SendAsync都new一个SocketAsyncEventArgs对象,那会造成性能问题,所以用于发送的SocketAsyncEventArgs对象必须能重复使用。可现在似乎找不到什么办法知道SendAsync是否结束 --------------------编程问答-------------------- 你测试过“每次SendAsync都new一个SocketAsyncEventArgs对象,那会造成性能问题”了吗?造成多大的性能问题呢?

如果你喜欢“洁癖”,那么你可以使用一个 static Queue<SocketAsyncEventArgs> 用来重复使用 new 出来的这中对象,这样仅在必要的时候才 new 一个新的对象。并且Queue也是线程安全的。 --------------------编程问答-------------------- 事实上在99.9%的应用中,对于低级功能的那种网络上的貌似有理的“洁癖”式的说法,往往都是没有什么差别的。如果你在架构等方面稍微做一点调整,可以让性能提高几倍。而死抠这种“是不是要new一个对象”之类的代码,性能提高不足万分之一,而且花费了大量精力甚至写下来一大堆难以维护的代码。 --------------------编程问答-------------------- 由于一些不恰当的宣传,有些人总是纠结于“是否new一个对象比较消耗内存”的问题,这有时候有可能是一种“担心天塌下来”的幼稚病在作怪。

对于.net平台系统来说,有着比较好的垃圾回收机制,那么许多方面的“内存”量你可以看成是“无限大”的,因为它会反复循环使用,因此绝对不会有任何内存容量问题。

那么剩下的就是速度问题。假设你为了“省下new对象的空间”而造成了程序逻辑问题,你就不得不使用一些运行低速的处理方法,例如你使用 Queue 或者加锁的机制来保证多线程安全地复用某些对象集合,其实你的程序再分配获取一个 SocketAsyncEventArgs 对象实例时比 new 一个新的对象实例慢了20倍。那么你现在还觉得“每次都new一个SocketAsyncEventArgs对象,那会造成性能问题”吗?

要想知道正确的结论,自己做测试,用数据说话。不要被一些博客上的说法所左右。 --------------------编程问答--------------------
引用 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,那他们的消息谁会先发出?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,