Sdílet prostřednictvím


BufferedStream.WriteByte už neprovádí implicitní vyprázdnění.

Metoda BufferedStream.WriteByte(Byte) již neprovádí implicitní vyprázdnění, pokud je vnitřní vyrovnávací paměť plná. Tato změna zarovná chování BufferedStream.WriteByte s jinými Write metodami ve BufferedStream třídě, například BufferedStream.Write(Byte[], Int32, Int32) a BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), které neprovádí implicitní vyprázdnění.

Verze byla představena

.NET 10

Předchozí chování

Dříve, když byla vnitřní vyrovnávací paměť BufferedStream plná, volání WriteByte automaticky vyprázdnilo vyrovnávací paměť do podkladového datového proudu. Toto chování bylo nekonzistentní s jinými Write metodami v BufferedStream.

Následující příklad ukazuje předchozí chování:

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

Nové chování

Počínaje .NET 10 metoda WriteByte už neprovádí implicitní vyprázdnění, pokud je vnitřní vyrovnávací paměť plná. Vyrovnávací paměť se vyprázdní pouze tehdy, když je explicitně volána metoda BufferedStream.Flush() nebo když je BufferedStream uvolněna.

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

BufferedStream.WriteByte(Byte) implicitní chování vyprázdnění bylo nekonzistentní s jinými Write metodami ve BufferedStream třídě, například Write a WriteAsync. Tato nekonzistence může vést k neočekávaným problémům s výkonem systému nebo nežádoucím vedlejším účinkům při práci s datovými proudy, které jsou citlivé na operace vyprázdnění dat. Odstranění implicitního vyprázdnění zajišťuje konzistentní chování ve všech metodách Write v BufferedStream.

Pokud vaše aplikace spoléhá na implicitní chování BufferedStream.WriteByte vyprázdnění, aktualizujte kód tak, aby explicitně volal metodu Flush v případě potřeby. Například:

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

Ovlivněná rozhraní API