/// <summary>
/// 所有的SocketAsyncEventArgs使用的大缓冲区
/// </summary>
private readonly byte[] _buffer;
/// <summary>
/// 将ArraySegment拷贝到args的缓冲区
/// </summary>
/// <param name="srcArr">要拷贝的ArraySegment</param>
/// <param name="args">SocketAsyncEventArgs</param>
public void BufferCopy(ArraySegment<byte> srcArr, SocketAsyncEventArgs args)
{
if (srcArr.Count < 100)
Array.Clear(_buffer, args.Offset, 100);
Buffer.BlockCopy(srcArr.Array, srcArr.Offset, _buffer, args.Offset, srcArr.Count);
}
=============================================================================================
上面的函数,是 通讯的时候 给 SocketAsyncEventArgs缓冲区拷贝数据的。 其中_buffer被若干个 SocketAsyncEventArgs使用的大缓冲区。很显然,每个SocketAsyncEventArgs使用 _buffer的不同区段。
这个函数之前我是 加锁的,使用的 ReaderWriterLockSlim.EnterWriteLock(); 之后经过推敲,我觉得集合大小没有修改,仅仅是 往里面拷贝数据。没有必要进行锁定。不知我的想法是否正确,疑惑中。
原先的代码:
_rwLock.EnterWriteLock();
if (srcArr.Count < 100)
Array.Clear(_buffer, args.Offset, 100);
Buffer.BlockCopy(srcArr.Array, srcArr.Offset, _buffer, args.Offset, srcArr.Count);
_rwLock.ExistWriteLock();
------解决方案--------------------------------------------------------
看来SocketAsyncEventArgs这个类开始被越来越多的人使用了,你用的是内存池吧?既然是每个SocketAsyncEventArgs类对应着一段自己独享的内存缓冲区的话,那何必要去加锁操作呢?
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------