//上次剩余长度
int iLastLeft = m_datagramBuffer.Length;
//合并之后的大小
int iCombineLen = iLastLeft + readBytesLength;
//合并缓存
byte[] bTmpAlls = new byte[iCombineLen];
//m_AllBuffer 与当前可读数据合并
Buffer.BlockCopy(m_datagramBuffer, 0, bTmpAlls, 0, iLastLeft);
Buffer.BlockCopy(m_receiveBuffer, 0, bTmpAlls, iLastLeft, readBytesLength);
目的得到m_datagramBuffer和m_receiveBuffer的合并数组,数组有时候比较大
这样写的,还是会出现OutOfMemoryException异常

解决方案 »

  1.   

    vb?帮你顶一下。
    数组比较大,多大呢?Buffer.BlockCopy这个方法执行多长时间呢?
      

  2.   

    Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。
      

  3.   

    Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。new 的时候溢出?是不是长度数据出错了?
      

  4.   

    那就别频繁创建,建个大点全局缓冲区,如果需要更大的再重新new
      

  5.   

    Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。new 的时候溢出?是不是长度数据出错了?恩,new的时候溢出,其实有时候才几百K就溢出了。数据长度没错那就别频繁创建,建个大点全局缓冲区,如果需要更大的再重新new
    其实是这样,客户端发送过来的缓冲区需要组包,得把前面剩下的组合到现在接受到的,可能有几M也可能几K,所以这个数组很动态得重建,扩容
      

  6.   

    关键是你要写清楚,你要干什么。Buffer.BlockCopy(m_datagramBuffer, 0, bTmpAlls, 0, iLastLeft);
    Buffer.BlockCopy(m_receiveBuffer, 0, bTmpAlls, iLastLeft, readBytesLength);最好是这样。
    创建一个缓存区,比如10K,这个缓存区的大小一定要能容纳你最大的数据包,
    然后每次处理完一个包之后,就把缓冲区中剩下的数据移动缓冲区的最前面,然后又开始合并下一次接收的数据,
    如此反复。1.合并
    2.判断是否完整
    3.移除完整包
    4.剩余数据往前移