BufferedStream.WriteByte utför inte längre implicit tömning

Metoden BufferedStream.WriteByte(Byte) utför inte längre en implicit tömning när den interna bufferten är full. Den här ändringen justerar beteendet hos BufferedStream.WriteByte så att det stämmer överens med andra Write-metoder i BufferedStream-klassen, till exempel BufferedStream.Write(Byte[], Int32, Int32) och BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), som inte utför en implicit spolning.

Version lanserad

.NET 10

Tidigare beteende

Tidigare, när den interna bufferten för en BufferedStream var full, tömdes bufferten automatiskt till den underliggande strömmen när WriteByte anropades. Det här beteendet var inkonsekvent med andra Write metoder i BufferedStream.

I följande exempel visas det tidigare beteendet:

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

Nytt beteende

Från och med .NET 10 WriteByte utför metoden inte längre en implicit tömning när den interna bufferten är full. Bufferten töms endast när metoden uttryckligen BufferedStream.Flush() anropas eller när den BufferedStream tas bort.

Typ av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändring

Det implicita tömningsbeteendet hos BufferedStream.WriteByte(Byte) var inkonsekvent med andra metoder i Write-klassen, till exempel BufferedStream och Write. Den här inkonsekvensen kan leda till oväntade prestandaproblem eller oavsiktliga biverkningar när du arbetar med strömmar som är känsliga för tömningsåtgärder. Om du tar bort implicit tömning säkerställs konsekvent beteende för alla Write metoder i BufferedStream.

Om din applikation förlitar sig på implicit tömningsbeteende av BufferedStream.WriteByte, uppdatera koden för att uttryckligen anropa Flush-metoden när det behövs. Till exempel:

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

Berörda API:er