Udostępnij przez


BufferedStream.WriteByte nie wykonuje już niejawnego opróżniania

Metoda BufferedStream.WriteByte(Byte) nie wykonuje już niejawnego opróżniania, gdy bufor wewnętrzny jest pełny. Ta zmiana dostosowuje zachowanie BufferedStream.WriteByte do innych metod Write w klasie BufferedStream, takich jak BufferedStream.Write(Byte[], Int32, Int32) i BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), które nie wykonują niejawnego opróżniania.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej, gdy wewnętrzny bufor elementu BufferedStream był pełny, wywołanie WriteByte automatycznie opróżniło bufor do bazowego strumienia. To zachowanie było niespójne z innymi metodami Write w BufferedStream.

W poniższym przykładzie pokazano poprzednie zachowanie:

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

Nowe zachowanie

Począwszy od frameworku .NET 10, metoda WriteByte nie wykonuje już niejawnego czyszczenia, gdy wewnętrzny bufor jest pełny. Bufor jest opróżniany tylko wtedy, gdy metoda BufferedStream.Flush() jest jawnie wywoływana lub gdy BufferedStream jest zlikwidowany.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Niejawne zachowanie opróżniania bufora przez BufferedStream.WriteByte(Byte) było niespójne z innymi metodami Write w klasie BufferedStream, takimi jak Write i WriteAsync. Ta niespójność może prowadzić do nieoczekiwanych problemów z wydajnością lub niezamierzonych skutków ubocznych podczas pracy ze strumieniami, które są wrażliwe na operacje opróżniania. Usunięcie niejawnego opróżniania zapewnia spójne zachowanie we wszystkich Write metodach w programie BufferedStream.

Jeśli aplikacja korzysta z niejawnego zachowania automatycznego opróżnianiaBufferedStream.WriteByte, zaktualizuj kod, aby jawnie wywołać metodę Flush, gdy jest to potrzebne. Przykład:

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

Interfejsy API, których dotyczy problem