SocketAsyncEventArgs.SetBuffer 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
初始化要用于异步套接字方法的数据缓冲区。
重载
SetBuffer(Memory<Byte>) |
使用异步套接字方法设置要用作缓冲区的内存区域。 |
SetBuffer(Int32, Int32) |
设置要用于异步套接字方法的数据缓冲区。 |
SetBuffer(Byte[], Int32, Int32) |
设置要用于异步套接字方法的数据缓冲区。 |
注解
此方法将 Buffer 属性设置为 null,将 Count 和 Offset 属性设置为零。
SetBuffer(Memory<Byte>)
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
使用异步套接字方法设置要用作缓冲区的内存区域。
public:
void SetBuffer(Memory<System::Byte> buffer);
public void SetBuffer (Memory<byte> buffer);
member this.SetBuffer : Memory<byte> -> unit
Public Sub SetBuffer (buffer As Memory(Of Byte))
参数
注解
此方法将 MemoryBuffer 属性设置为 buffer
参数,将 Count 属性设置为 buffer
长度,将 Offset 属性设置为零。
适用于
SetBuffer(Int32, Int32)
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
设置要用于异步套接字方法的数据缓冲区。
public:
void SetBuffer(int offset, int count);
public void SetBuffer (int offset, int count);
member this.SetBuffer : int * int -> unit
Public Sub SetBuffer (offset As Integer, count As Integer)
参数
- offset
- Int32
数据缓冲区中操作开始位置处的偏移量,以字节为单位。
- count
- Int32
可在缓冲区中发送或接收的最大数据量(以字节为单位)。
例外
参数超出范围。 如果 offset
参数小于零或大于 Buffer 属性中的数组长度,将发生此异常。 如果 count
参数小于零或大于 Buffer 属性中的数组长度减去 offset
参数的值,也会发生此异常。
注解
offset
和 count
参数不能为负数。 和 参数的组合offset
必须位于 属性中缓冲区数组的边界内Buffer。count
此方法将 Count 属性设置为 count
参数,将 Offset 属性设置为 offset
参数。
Buffer如果 属性为 null,此方法将offset
忽略 和 count
参数,Offset并将 和 Count 属性设置为 0。
此方法不会更改 Buffer 属性。
另请参阅
适用于
SetBuffer(Byte[], Int32, Int32)
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
- Source:
- SocketAsyncEventArgs.cs
设置要用于异步套接字方法的数据缓冲区。
public:
void SetBuffer(cli::array <System::Byte> ^ buffer, int offset, int count);
public void SetBuffer (byte[] buffer, int offset, int count);
public void SetBuffer (byte[]? buffer, int offset, int count);
member this.SetBuffer : byte[] * int * int -> unit
Public Sub SetBuffer (buffer As Byte(), offset As Integer, count As Integer)
参数
- buffer
- Byte[]
要用于异步套接字方法的数据缓冲区。
- offset
- Int32
数据缓冲区中操作开始位置处的偏移量,以字节为单位。
- count
- Int32
可在缓冲区中发送或接收的最大数据量(以字节为单位)。
例外
指定的缓冲区不明确。 如果 Buffer 属性不为 null,BufferList 属性也不为 null,将发生此异常。
参数超出范围。 如果 offset
参数小于零或大于 Buffer 属性中的数组长度,将发生此异常。 如果 count
参数小于零或大于 Buffer 属性中的数组长度减去 offset
参数的值,也会发生此异常。
示例
下面的代码示例创建单个大型缓冲区,该缓冲区可以拆分并分配给 SocketAsyncEventArgs 对象以用于每个套接字 I/O 操作。 这样可以轻松重用缓冲区,并防止堆内存碎片化。
// This class creates a single large buffer which can be divided up
// and assigned to SocketAsyncEventArgs objects for use with each
// socket I/O operation.
// This enables bufffers to be easily reused and guards against
// fragmenting heap memory.
//
// The operations exposed on the BufferManager class are not thread safe.
class BufferManager
{
int m_numBytes; // the total number of bytes controlled by the buffer pool
byte[] m_buffer; // the underlying byte array maintained by the Buffer Manager
Stack<int> m_freeIndexPool; //
int m_currentIndex;
int m_bufferSize;
public BufferManager(int totalBytes, int bufferSize)
{
m_numBytes = totalBytes;
m_currentIndex = 0;
m_bufferSize = bufferSize;
m_freeIndexPool = new Stack<int>();
}
// Allocates buffer space used by the buffer pool
public void InitBuffer()
{
// create one big large buffer and divide that
// out to each SocketAsyncEventArg object
m_buffer = new byte[m_numBytes];
}
// Assigns a buffer from the buffer pool to the
// specified SocketAsyncEventArgs object
//
// <returns>true if the buffer was successfully set, else false</returns>
public bool SetBuffer(SocketAsyncEventArgs args)
{
if (m_freeIndexPool.Count > 0)
{
args.SetBuffer(m_buffer, m_freeIndexPool.Pop(), m_bufferSize);
}
else
{
if ((m_numBytes - m_bufferSize) < m_currentIndex)
{
return false;
}
args.SetBuffer(m_buffer, m_currentIndex, m_bufferSize);
m_currentIndex += m_bufferSize;
}
return true;
}
// Removes the buffer from a SocketAsyncEventArg object.
// This frees the buffer back to the buffer pool
public void FreeBuffer(SocketAsyncEventArgs args)
{
m_freeIndexPool.Push(args.Offset);
args.SetBuffer(null, 0, 0);
}
}
注解
offset
和 count
参数不能为负数。 和 参数的组合offset
必须位于 参数中的数据数组的边界内buffer
。count
此方法将 Buffer 属性设置为 buffer
参数,将 Count 属性设置为 count
参数,将 Offset 属性设置为 offset
参数。