Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.
Action recommandée
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