Compartir por


BufferedStream.WriteByte ya no realiza el vaciado implícito

El BufferedStream.WriteByte(Byte) método ya no realiza un vaciado implícito cuando el búfer interno está lleno. Este cambio alinea el comportamiento de BufferedStream.WriteByte con otros Write métodos de la BufferedStream clase , como BufferedStream.Write(Byte[], Int32, Int32) y BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), que no realizan un vaciado implícito.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, cuando el búfer interno de un BufferedStream estaba lleno, invocar WriteByte vaciaba automáticamente el búfer en la secuencia subyacente. Este comportamiento era incoherente con otros Write métodos de BufferedStream.

En el ejemplo siguiente se muestra el comportamiento anterior:

StreamWithFlush streamWithFlush = new();
BufferedStream bufferedStream = new(streamWithFlush, bufferSize: 4);

// Write 4 bytes to fill the buffer
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // In .NET 9 and earlier, this caused an implicit flush

class StreamWithFlush : MemoryStream
{
    public override void Flush()
    {
        Console.WriteLine("Flush was called.");

        base.Flush();
    }
}
Module PreviousBehaviorExample
    Sub Example()
        Dim streamWithFlush As New StreamWithFlush()
        Dim bufferedStream As New BufferedStream(streamWithFlush, bufferSize:=4)

        ' Write 4 bytes to fill the buffer
        bufferedStream.WriteByte(1)
        bufferedStream.WriteByte(2)
        bufferedStream.WriteByte(3)
        bufferedStream.WriteByte(4) ' In .NET 9 and earlier, this caused an implicit flush
    End Sub

    Class StreamWithFlush
        Inherits MemoryStream

        Public Overrides Sub Flush()
            Console.WriteLine("Flush was called.")
            MyBase.Flush()
        End Sub
    End Class
End Module

Nuevo comportamiento

A partir de .NET 10, el WriteByte método ya no realiza un vaciado implícito cuando el búfer interno está lleno. El búfer solo se vacía cuando se llama explícitamente al BufferedStream.Flush() método o cuando BufferedStream se elimina .

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

El comportamiento de vaciado implícito de BufferedStream.WriteByte(Byte) era incoherente con otros Write métodos de la BufferedStream clase , como Write y WriteAsync. Esta incoherencia podría provocar problemas de rendimiento inesperados o efectos secundarios no deseados al trabajar con secuencias que son sensibles a las operaciones de vaciado. Quitar el vaciado implícito garantiza un comportamiento coherente en todos los Write métodos de BufferedStream.

Si la aplicación se basa en el comportamiento implícito de vaciado de BufferedStream.WriteByte, actualice el código para llamar explícitamente al Flush método cuando sea necesario. Por ejemplo:

Before:

BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // Implicit flush occurred here in .NET 9 and earlier
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4) ' Implicit flush occurred here in .NET 9 and earlier

After:

BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4);
bufferedStream.Flush(); // Explicit flush
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4)
bufferedStream.Flush() ' Explicit flush

Las APIs afectadas