SocketAsyncEventArgs.SetBuffer 方法

定义

初始化要用于异步套接字方法的数据缓冲区。

重载

SetBuffer(Memory<Byte>)

使用异步套接字方法设置要用作缓冲区的内存区域。

SetBuffer(Int32, Int32)

设置要用于异步套接字方法的数据缓冲区。

SetBuffer(Byte[], Int32, Int32)

设置要用于异步套接字方法的数据缓冲区。

注解

此方法将 Buffer 属性设置为 null,将 CountOffset 属性设置为零。

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))

参数

buffer
Memory<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 参数的值,也会发生此异常。

注解

offsetcount 参数不能为负数。 和 参数的组合offset必须位于 属性中缓冲区数组的边界内Buffercount

此方法将 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);
    }
}

注解

offsetcount 参数不能为负数。 和 参数的组合offset必须位于 参数中的数据数组的边界内buffercount

此方法将 Buffer 属性设置为 buffer 参数,将 Count 属性设置为 count 参数,将 Offset 属性设置为 offset 参数。

另请参阅

适用于