同步线程模式 完全没有IAsyncResult对象的问题 是这个原因速度提高了吗

解决方案 »

  1.   

    我测试了收到数据后操作界面,全部接收完毕后界面会卡很久并发了近100W次的界面操作
    使用同步、异常的差距就在UDP 缓存 因为接收数据速度不一样,局域网急速发速度的时候整个缓冲区一下就被填满导致信息覆盖
    connect.ReceiveBufferSize = ReceiveBufferSize; 默认好像是8K 同步模式能基本保证客户端发送一条,服务器基本能马上接收到并发出界面操作事件。异步会因为缓冲区被覆盖导致丢失大量信息。
      

  2.   

    嗯嗯 就是这个意思,我理解应该是没错。
    因为缓冲区大小问题 用异步要设置的很大(我测试的比较暴力,几台机器每秒10W个小数据包发送)
    用异步缓冲区必须设置的很大才能保证数据不被覆盖(同意拿100W个包比同步慢40%)
    同步少了IAsyncResult 开销缓冲区有数据时拿走的快。
      

  3.   

    UDP 本来就是不可靠协议 ,而且UDP 的包一般不会粘包的吧(不会像TCP把各种小包打包到一起发送,就算1个字节UDP也是一个包发过来),退一步说不管怎么做这些都要处理(并发的事件)
    而且(UDP我打算是做信息传递,不发送大于1400的信息)
    我只是觉得单纯说接收数据包速度而言同步+线程的模式比直接使用异步方法效率更高。
      

  4.   

    也有可能某个人今天要来3个快递,但是不是一起来的,而是分别送了3次才送来的
     this.ReceiveData(packet, this.remoteEndPoint, null); 
    this.remoteEndPoint 可以当作是人
    packet 可以在里面添加信息表示要三个包都到了才是完整。
      

  5.   

    3.5 提供的 SocketAsyncEventArgs  类好像也降低了 IAsyncResult 的开销来提高效率
      

  6.   

    我还测试了并发事件的时候 
    先并发事件--->回调 线程池会按照接收到的数据次序处理界面, 
    先回调--->并发事件 线程池会把接收到的数据次序打乱处理界面, 
      

  7.   


    你终于拿出一些具体的东西来问了。实际上如果按照你说的“同步处理快、异步处理慢”,那么你也就看不到什么“丢失大量信息”的问题了。反之,正由于你的程序在并发处理时有bug而丢处理,并且异步系统的处理速度比你认为以为得更快许多,所以你才会搞不定的。同步、阻塞、循环,程序运行得很慢很卡,所以你才会觉得你的程序“稳定”。这时侯你应该好好看看你的程序设计问题。一般人都知道,当他异步、并发处理时,往往再写的有bug时会“丢失数据操作”,所以他就会努力找到自己的程序bug,而不会去怪“异步并发程序运行太慢所以丢数据”的。
      

  8.   

    嗯咯 我大概总结出来了,不管同步异步,始终高强度接收数据包的情况下如果来不及处理收到的数据包(收包,后台处理)。
    在程序内部并发数越来越多导致并发达到极限,内存CPU需求急剧上升最终-----》程序卡死
    缓冲区覆盖未处理的数据包---》丢包,程序内部处理不及时也会导致最终------》程序卡死
    不管怎么样一个程序总有一个处理极限,达到这个极限就会出现问题
    只能根据实际应用,网络情况来判断程序能不能承受。
      

  9.   

    不考虑代码质量太差的情况,只考虑正常的应用中
    要么是用空间换时间,也就是要速度快,占内存和CPU资源就要多
    要么是用时间换空间想两个都提升,代码优化的空间毕竟有限,升级硬件才是根本的解决之道
    台式机到极限了,就换服务器,服务器到极限了,就换服务器组