Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
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.
Acción recomendada
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