Freigeben über


BufferedStream.WriteByte führt keine implizite Spülung mehr durch.

Die BufferedStream.WriteByte(Byte) Methode führt keine implizite Spülung mehr aus, wenn der interne Puffer voll ist. Diese Änderung gleicht das Verhalten von BufferedStream.WriteByte an andere Write Methoden in der BufferedStream Klasse an, wie z. B. BufferedStream.Write(Byte[], Int32, Int32) und BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), die keine implizite Spülung ausführen.

Eingeführt in Version

.NET 10

Vorheriges Verhalten

Wenn der interne Puffer eines BufferedStream voll war, hat der Aufruf von WriteByte zuvor automatisch den unterliegenden Stream geleert. Dieses Verhalten war inkonsistent mit anderen Write Methoden in BufferedStream.

Im folgenden Beispiel wird das vorherige Verhalten veranschaulicht:

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

Neues Verhalten

Ab .NET 10 führt die WriteByte Methode keine implizite Spülung mehr aus, wenn der interne Puffer voll ist. Der Puffer wird nur geleert, wenn die BufferedStream.Flush() Methode explizit aufgerufen wird oder wenn BufferedStream freigegeben wird.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für Änderung

Das implizite Flush-Verhalten von BufferedStream.WriteByte(Byte) war inkonsistent mit anderen Methoden von Write in der BufferedStream Klasse, wie z. B. Write und WriteAsync. Diese Inkonsistenz könnte zu unerwarteten Leistungsproblemen oder unbeabsichtigten Nebenwirkungen führen, wenn Sie mit Datenströmen arbeiten, die für Löschvorgänge empfindlich sind. Das Entfernen des impliziten Flush stellt ein konsistentes Verhalten für alle Write Methoden in BufferedStream sicher.

Wenn Ihre Anwendung auf das implizite Flush-Verhalten BufferedStream.WriteByteangewiesen ist, aktualisieren Sie den Code so, dass die Flush Methode bei Bedarf explizit aufgerufen wird. Beispiel:

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

Betroffene APIs