Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Classe BufferedStream

Consente di aggiungere un livello di buffer per leggere e scrivere le operazioni su un altro flusso. La classe non può essere ereditata.

Spazio dei nomi:  System.IO
Assembly:  mscorlib (in mscorlib.dll)
[ComVisibleAttribute(true)]
public sealed class BufferedStream : Stream

Il tipo BufferedStream espone i seguenti membri.

  NomeDescrizione
Metodo pubblicoBufferedStream(Stream)Inizializza una nuova istanza della classe BufferedStream con una dimensione predefinita del buffer di 4096 byte.
Metodo pubblicoBufferedStream(Stream, Int32)Inizializza una nuova istanza della classe BufferedStream con la dimensione specificata del buffer.
In alto
  NomeDescrizione
Proprietà pubblicaCanReadOttiene un valore che indica se il flusso corrente supporta la lettura. (Esegue l'override di Stream.CanRead).
Proprietà pubblicaCanSeekOttiene un valore che indica se il flusso corrente supporta la ricerca. (Esegue l'override di Stream.CanSeek).
Proprietà pubblicaCanTimeoutOttiene un valore che determina se il flusso corrente prevede il timeout. (Ereditato da Stream)
Proprietà pubblicaCanWriteOttiene un valore che indica se il flusso corrente supporta la scrittura. (Esegue l'override di Stream.CanWrite).
Proprietà pubblicaLengthOttiene la lunghezza del flusso in byte. (Esegue l'override di Stream.Length).
Proprietà pubblicaPositionOttiene la posizione all'interno del flusso corrente. (Esegue l'override di Stream.Position).
Proprietà pubblicaReadTimeoutOttiene o imposta un valore, in millisecondi, che determina per quanto tempo il flusso tenterà la lettura prima del timeout. (Ereditato da Stream)
Proprietà pubblicaWriteTimeoutOttiene o imposta un valore, in millisecondi, che determina per quanto tempo il flusso tenterà la scrittura prima del timeout. (Ereditato da Stream)
In alto
  NomeDescrizione
Metodo pubblicoBeginReadInizia un'operazione di lettura asincrona. (Considerare l'utilizzo di ReadAsync anziché vedere la sezione relativa alle osservazioni). (Esegue l'override di Stream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object)).

In .NET Framework Client Profile 4 questo membro viene ereditato da Stream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).
Metodo pubblicoBeginWriteInizia un'operazione di scrittura asincrona. (Considerare l'utilizzo di WriteAsync anziché vedere la sezione relativa alle osservazioni). (Esegue l'override di Stream.BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object)).

In .NET Framework Client Profile 4 questo membro viene ereditato da Stream.BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object).
Metodo pubblicoCloseConsente di chiudere il flusso corrente e di liberare le risorse, come socket e handle di file, ad esso associate. Anziché chiamare questo metodo, assicurarsi che il flusso sia eliminato correttamente. (Ereditato da Stream)
Metodo pubblicoCopyTo(Stream)Legge i byte dal flusso corrente e li scrive in un altro flusso. (Ereditato da Stream)
Metodo pubblicoCopyTo(Stream, Int32)Legge tutti i byte dal flusso corrente e li scrive in un altro flusso, utilizzando una dimensione di buffer specificata. (Ereditato da Stream)
Metodo pubblicoCopyToAsync(Stream)Legge in modo asincrono i byte dal flusso corrente e li scrive in un altro flusso. (Ereditato da Stream)
Metodo pubblicoCopyToAsync(Stream, Int32)Legge in modo asincrono tutti i byte dal flusso corrente e li scrive in un altro flusso, utilizzando una dimensione di buffer specificata. (Ereditato da Stream)
Metodo pubblicoCopyToAsync(Stream, Int32, CancellationToken)Legge in modo asincrono i byte dal flusso corrente e li scrive in un altro flusso, utilizzando una dimensione di buffer specificata e un token di annullamento. (Ereditato da Stream)
Metodo pubblicoCreateObjRefCrea un oggetto che contiene tutte le informazioni rilevanti obbligatorio per generare un proxy utilizzato per comunicare con un oggetto remoto. (Ereditato da MarshalByRefObject)
Metodo pubblicoDispose()Rilascia tutte le risorse utilizzate dalla classe Stream. (Ereditato da Stream)
Metodo pubblicoEndReadAttende il completamento dell'operazione di lettura asincrona in sospeso. (Considerare l'utilizzo di ReadAsync anziché vedere la sezione relativa alle osservazioni). (Esegue l'override di Stream.EndRead(IAsyncResult)).

In .NET Framework Client Profile 4 questo membro viene ereditato da Stream.EndRead(IAsyncResult).
Metodo pubblicoEndWriteTermina un'operazione di scrittura asincrona, rimanendo bloccato fino al completamento dell'operazione di I/O. (Considerare l'utilizzo di WriteAsync anziché vedere la sezione relativa alle osservazioni). (Esegue l'override di Stream.EndWrite(IAsyncResult)).

In .NET Framework Client Profile 4 questo membro viene ereditato da Stream.EndWrite(IAsyncResult).
Metodo pubblicoEquals(Object) Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object)
Metodo pubblicoFlushConsente di cancellare i dati di tutti i buffer del flusso e la scrittura dei dati memorizzati nel buffer nella periferica sottostante. (Esegue l'override di Stream.Flush()).
Metodo pubblicoFlushAsync()Consente di cancellare in modo asincrono i dati di tutti i buffer del flusso e la scrittura dei dati memorizzati nel buffer nel dispositivo sottostante. (Ereditato da Stream)
Metodo pubblicoFlushAsync(CancellationToken)Cancella in modo asincrono tutti i buffer del flusso e consente la scrittura dei dati memorizzati nel buffer nel dispositivo sottostante e monitora le richieste di annullamento. (Esegue l'override di Stream.FlushAsync(CancellationToken)).
Metodo pubblicoGetHashCodeFunge da funzione hash per un determinato tipo. (Ereditato da Object)
Metodo pubblicoGetLifetimeServiceRecupera l'oggetto corrente del servizio di durata che controlla i criteri di durata dell'istanza. (Ereditato da MarshalByRefObject)
Metodo pubblicoGetTypeOttiene l'oggetto Type dell'istanza corrente. (Ereditato da Object)
Metodo pubblicoInitializeLifetimeServiceOttiene un oggetto di servizio di durata per controllare i criteri di durata dell'istanza. (Ereditato da MarshalByRefObject)
Metodo pubblicoReadCopia i byte dal flusso correntemente memorizzato nel buffer in una matrice. (Esegue l'override di Stream.Read(Byte[], Int32, Int32)).
Metodo pubblicoReadAsync(Byte[], Int32, Int32)Legge in modo asincrono una sequenza di byte dal flusso corrente e fa avanzare la posizione corrente nel flusso del numero di byte letti. (Ereditato da Stream)
Metodo pubblicoReadAsync(Byte[], Int32, Int32, CancellationToken)Legge in modo asincrono una sequenza di byte dal flusso corrente e passa alla posizione successiva all'interno del flusso corrente in base al numero di byte letti e monitora le richieste di annullamento. (Esegue l'override di Stream.ReadAsync(Byte[], Int32, Int32, CancellationToken)).
Metodo pubblicoReadByteLegge un byte dal flusso sottostante e restituisce il cast di byte su un parametro int o restituisce -1 se la lettura viene eseguita a partire dalla fine del flusso. (Esegue l'override di Stream.ReadByte()).
Metodo pubblicoSeekImposta la posizione all'interno del flusso corrente memorizzato nel buffer. (Esegue l'override di Stream.Seek(Int64, SeekOrigin)).
Metodo pubblicoSetLengthImposta la lunghezza del flusso memorizzato nel buffer. (Esegue l'override di Stream.SetLength(Int64)).
Metodo pubblicoToString Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object)
Metodo pubblicoWriteCopia i byte nel flusso memorizzato nel buffer e sposta la posizione corrente, all'interno del flusso memorizzato nel buffer, in base al numero di byte scritto. (Esegue l'override di Stream.Write(Byte[], Int32, Int32)).
Metodo pubblicoWriteAsync(Byte[], Int32, Int32)Scrive in modo asincrono una sequenza di byte nel flusso corrente e fa avanzare la posizione corrente nel flusso del numero di byte scritti. (Ereditato da Stream)
Metodo pubblicoWriteAsync(Byte[], Int32, Int32, CancellationToken)Scrive in modo asincrono una sequenza di byte nel flusso corrente e passa alla posizione successiva all'interno del flusso corrente in base al numero di byte scritti e monitora le richieste di annullamento. (Esegue l'override di Stream.WriteAsync(Byte[], Int32, Int32, CancellationToken)).
Metodo pubblicoWriteByteScrive un byte nella posizione corrente all'interno del flusso memorizzato nel buffer. (Esegue l'override di Stream.WriteByte(Byte)).
In alto
  NomeDescrizione
Metodo di estensione pubblicoAsInputStreamConverte un flusso gestito in .NET per applicazioni Windows Store in un flusso di input in Windows Runtime. (Definito da WindowsRuntimeStreamExtensions).
Metodo di estensione pubblicoAsOutputStreamConverte un flusso gestito in .NET per applicazioni Windows Store in un flusso di output in Windows Runtime. (Definito da WindowsRuntimeStreamExtensions).
In alto

Un buffer è un blocco di byte in memoria utilizzato per memorizzare temporaneamente i dati e ridurre così il numero di chiamate al sistema operativo. Grazie ai buffer è possibile migliorare le prestazioni in lettura e in scrittura. Un buffer può essere utilizzato per la lettura o la scrittura, ma non per entrambe le operazioni contemporaneamente. I metodi Read e Write di BufferedStream gestiscono automaticamente il buffer.

Una classe BufferedStream può essere composta da determinati tipi di flussi. Fornisce l'implementazione per la lettura e la scrittura di byte in un'origine dati o repository sottostante. Utilizzare BinaryReader e BinaryWriter per la lettura e la scrittura di altri tipi di dati. La funzione di BufferedStream è quella di impedire il rallentamento delle operazioni di input e output del buffer quando questo non è necessario. Se si leggono e si scrivono sempre dati le cui dimensioni sono maggiori di quelle del buffer interno, BufferedStream potrebbe persino non allocare il buffer interno. BufferedStream memorizza anche i dati letti e scritti in un buffer condiviso. Si presume che l'utente effettui quasi sempre una serie di letture o scritture, alternando raramente le due operazioni.

Gli esempi di codice seguenti viene illustrato come utilizzare la classe BufferedStream sulla classe NetworkStream per aumentare le prestazioni di determinate operazioni di I/O. Avviare il server su un computer remoto prima di avviare il client. Specificare il nome del computer remoto come argomento della riga di comando quando si avvia il client. Variare le costanti dataArraySize e streamBufferSize per visualizzare il loro effetto sulle prestazioni.

Nel primo esempio viene illustrato il codice eseguito sul client e il secondo esempio viene illustrato il codice che viene eseguito sul server.

Esempio 1: Codice che viene eseguito sul client


using System;
using System.IO;
using System.Globalization;
using System.Net;
using System.Net.Sockets;

public class Client
{
    const int dataArraySize    =   100;
    const int streamBufferSize =  1000;
    const int numberOfLoops    = 10000;

    static void Main(string[] args)
    {
        // Check that an argument was specified when the
        // program was invoked.
        if(args.Length == 0)
        {
            Console.WriteLine("Error: The name of the host computer" +
                " must be specified when the program is invoked.");
            return;
        }

        string remoteName = args[0];

        // Create the underlying socket and connect to the server.
        Socket clientSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        clientSocket.Connect(new IPEndPoint(
            Dns.Resolve(remoteName).AddressList[0], 1800));

        Console.WriteLine("Client is connected.\n");

        // Create a NetworkStream that owns clientSocket and
        // then create a BufferedStream on top of the NetworkStream.
        // Both streams are disposed when execution exits the
        // using statement.
        using(Stream
            netStream = new NetworkStream(clientSocket, true),
            bufStream =
                  new BufferedStream(netStream, streamBufferSize))
        {
            // Check whether the underlying stream supports seeking.
            Console.WriteLine("NetworkStream {0} seeking.\n",
                bufStream.CanSeek ? "supports" : "does not support");

            // Send and receive data.
            if(bufStream.CanWrite)
            {
                SendData(netStream, bufStream);
            }
            if(bufStream.CanRead)
            {
                ReceiveData(netStream, bufStream);
            }

            // When bufStream is closed, netStream is in turn
            // closed, which in turn shuts down the connection
            // and closes clientSocket.
            Console.WriteLine("\nShutting down the connection.");
            bufStream.Close();
        }
    }

    static void SendData(Stream netStream, Stream bufStream)
    {
        DateTime startTime;
        double networkTime, bufferedTime;

        // Create random data to send to the server.
        byte[] dataToSend = new byte[dataArraySize];
        new Random().NextBytes(dataToSend);

        // Send the data using the NetworkStream.
        Console.WriteLine("Sending data using NetworkStream.");
        startTime = DateTime.Now;
        for(int i = 0; i < numberOfLoops; i++)
        {
            netStream.Write(dataToSend, 0, dataToSend.Length);
        }
        networkTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes sent in {1} seconds.\n",
            numberOfLoops * dataToSend.Length,
            networkTime.ToString("F1"));

        // Send the data using the BufferedStream.
        Console.WriteLine("Sending data using BufferedStream.");
        startTime = DateTime.Now;
        for(int i = 0; i < numberOfLoops; i++)
        {
            bufStream.Write(dataToSend, 0, dataToSend.Length);
        }
        bufStream.Flush();
        bufferedTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes sent in {1} seconds.\n",
            numberOfLoops * dataToSend.Length,
            bufferedTime.ToString("F1"));

        // Print the ratio of write times.
        Console.WriteLine("Sending data using the buffered " +
            "network stream was {0} {1} than using the network " +
            "stream alone.\n",
            (networkTime/bufferedTime).ToString("P0"),
            bufferedTime < networkTime ? "faster" : "slower");
    }

    static void ReceiveData(Stream netStream, Stream bufStream)
    {
        DateTime startTime;
        double networkTime, bufferedTime = 0;
        int bytesReceived = 0;
        byte[] receivedData = new byte[dataArraySize];

        // Receive data using the NetworkStream.
        Console.WriteLine("Receiving data using NetworkStream.");
        startTime = DateTime.Now;
        while(bytesReceived < numberOfLoops * receivedData.Length)
        {
            bytesReceived += netStream.Read(
                receivedData, 0, receivedData.Length);
        }
        networkTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes received in {1} seconds.\n",
            bytesReceived.ToString(),
            networkTime.ToString("F1"));

        // Receive data using the BufferedStream.
        Console.WriteLine("Receiving data using BufferedStream.");
        bytesReceived = 0;
        startTime = DateTime.Now;

        int numBytesToRead = receivedData.Length;

        while (numBytesToRead > 0)
        {
            // Read may return anything from 0 to numBytesToRead.
            int n = bufStream.Read(receivedData,0, receivedData.Length);
            // The end of the file is reached.
            if (n == 0)
                break;
            bytesReceived += n;
            numBytesToRead -= n;
        }

        bufferedTime = (DateTime.Now - startTime).TotalSeconds;
        Console.WriteLine("{0} bytes received in {1} seconds.\n",
            bytesReceived.ToString(),
            bufferedTime.ToString("F1"));

        // Print the ratio of read times.
        Console.WriteLine("Receiving data using the buffered network" +
            " stream was {0} {1} than using the network stream alone.",
            (networkTime/bufferedTime).ToString("P0"),
            bufferedTime < networkTime ? "faster" : "slower");
    }
}


Esempio 2: Codice che viene eseguito sul server


using System;
using System.Net;
using System.Net.Sockets;

public class Server 
{
    static void Main() 
    {
        // This is a Windows Sockets 2 error code.
        const int WSAETIMEDOUT = 10060;

        Socket serverSocket;
        int bytesReceived, totalReceived = 0;
        byte[] receivedData = new byte[2000000];

        // Create random data to send to the client.
        byte[] dataToSend = new byte[2000000];
        new Random().NextBytes(dataToSend);

        IPAddress ipAddress =
            Dns.Resolve(Dns.GetHostName()).AddressList[0];

        IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, 1800);

        // Create a socket and listen for incoming connections.
        using(Socket listenSocket = new Socket(
            AddressFamily.InterNetwork, SocketType.Stream, 
            ProtocolType.Tcp))
        {
            listenSocket.Bind(ipEndpoint);
            listenSocket.Listen(1);

            // Accept a connection and create a socket to handle it.
            serverSocket = listenSocket.Accept();
            Console.WriteLine("Server is connected.\n");
        }

        try
        {
            // Send data to the client.
            Console.Write("Sending data ... ");
            int bytesSent = serverSocket.Send(
                dataToSend, 0, dataToSend.Length, SocketFlags.None);
            Console.WriteLine("{0} bytes sent.\n", 
                bytesSent.ToString());

            // Set the timeout for receiving data to 2 seconds.
            serverSocket.SetSocketOption(SocketOptionLevel.Socket,
                SocketOptionName.ReceiveTimeout, 2000);

            // Receive data from the client.
            Console.Write("Receiving data ... ");
            try
            {
                do
                {
                    bytesReceived = serverSocket.Receive(receivedData,
                        0, receivedData.Length, SocketFlags.None);
                    totalReceived += bytesReceived;
                }
                while(bytesReceived != 0);
            }
            catch(SocketException e)
            {
                if(e.ErrorCode == WSAETIMEDOUT)
                {
                    // Data was not received within the given time.
                    // Assume that the transmission has ended.
                }
                else
                {
                    Console.WriteLine("{0}: {1}\n", 
                        e.GetType().Name, e.Message);
                }
            }
            finally
            {
                Console.WriteLine("{0} bytes received.\n",
                    totalReceived.ToString());
            }
        }
        finally
        {
            serverSocket.Shutdown(SocketShutdown.Both);
            Console.WriteLine("Connection shut down.");
            serverSocket.Close();
        }
    }
}


.NET Framework

Supportato in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Qualsiasi membro static (Shared in Visual Basic) pubblico di questo tipo è thread-safe. I membri di istanza non sono garantiti come thread-safe.
Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
© 2013 Microsoft. Tutti i diritti riservati.