Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo SocketAsyncEventArgs.SetBuffer (Byte[], Int32, Int32)

 

Data di pubblicazione: ottobre 2016

Imposta il buffer di dati da utilizzare con un metodo socket asincrono.

Spazio dei nomi:   System.Net.Sockets
Assembly:  System (in System.dll)

public void SetBuffer(
	byte[] buffer,
	int offset,
	int count
)

Parametri

buffer
Type: System.Byte[]

Il buffer di dati da utilizzare con un metodo socket asincrono.

offset
Type: System.Int32

L'offset in byte, nel buffer di dati in cui inizia l'operazione.

count
Type: System.Int32

Quantità massima di dati, in byte, di inviare o ricevere nel buffer.

Exception Condition
ArgumentException

Esistono buffer ambigui specificati. Questa eccezione si verifica se il Buffer proprietà inoltre non è null e il BufferList proprietà inoltre non è null.

ArgumentOutOfRangeException

Un argomento non compreso nell'intervallo. Questa eccezione si verifica se il offset parametro è minore di zero o maggiore della lunghezza della matrice nella Buffer proprietà. Questa eccezione si verifica anche se il count parametro è minore di zero o maggiore della lunghezza della matrice nella Buffer proprietà meno il offset parametro.

Il offset e count parametri non possono essere numeri negativi. La combinazione di offset e count parametri devono essere compresa nei limiti della matrice di dati nel buffer parametro.

Questo metodo imposta il Buffer proprietà per il buffer parametro, il Count proprietà per il count parametro e il Offset proprietà per il offset parametro.

Esempio di codice seguente crea un solo buffer di grandi dimensioni che può essere suddiviso e assegnato a SocketAsyncEventArgs oggetti da utilizzare con ogni operazione dei / o del socket. In questo modo i buffer riutilizzare facilmente ed evita la frammentazione della memoria heap.

// 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);
    }

}

Universal Windows Platform
Disponibile da 10
.NET Framework
Disponibile da 2.0
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.1
Torna all'inizio
Mostra: