Partager via


BufferedStream.WriteByte n’effectue plus de vidage implicite

La BufferedStream.WriteByte(Byte) méthode n’effectue plus de vidage implicite lorsque la mémoire tampon interne est pleine. Cette modification aligne le comportement de BufferedStream.WriteByte avec celui d'autres méthodes de la classe Write, telles que BufferedStream et BufferedStream.Write(Byte[], Int32, Int32), qui n'effectuent pas de vidage implicite.

Version introduite

.NET 10

Comportement précédent

Auparavant, lorsque la mémoire tampon interne d’un BufferedStream était complète, l’appel à WriteByte vidait automatiquement la mémoire tampon sur le flux sous-jacent. Ce comportement était incohérent avec d’autres Write méthodes dans BufferedStream.

L’exemple suivant illustre le comportement précédent :

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

Nouveau comportement

À compter de .NET 10, la WriteByte méthode n’effectue plus de vidage implicite lorsque la mémoire tampon interne est pleine. La mémoire tampon est vidée uniquement lorsque la BufferedStream.Flush() méthode est explicitement appelée ou lorsque l'objet BufferedStream est supprimé.

Type de changement cassant

Ce changement est un changement de comportement.

Raison de la modification

Le comportement de vidage implicite de BufferedStream.WriteByte(Byte) était incohérent par rapport aux autres méthodes Write de la classe BufferedStream, telles que Write et WriteAsync. Cette incohérence peut entraîner des problèmes de performances inattendus ou des effets secondaires inattendus lors de l’utilisation de flux sensibles aux opérations de vidage. La suppression du vidage implicite garantit un comportement cohérent dans toutes les méthodes Write de BufferedStream.

Si votre application s’appuie sur le comportement de vidage implicite de BufferedStream.WriteByte, mettez à jour votre code pour appeler explicitement la Flush méthode si nécessaire. Par exemple:

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

API affectées