Bagikan melalui


BufferedStream.WriteByte tidak lagi melakukan flush implisit

Metode BufferedStream.WriteByte(Byte) ini tidak lagi melakukan flush implisit ketika buffer internal penuh. Perubahan ini menyelaraskan perilaku BufferedStream.WriteByte dengan metode lain Write di BufferedStream kelas, seperti BufferedStream.Write(Byte[], Int32, Int32) dan BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), yang tidak melakukan flush implisit.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, ketika buffer BufferedStream internal penuh, panggilan WriteByte secara otomatis mengosongkan buffer ke aliran dasar. Perilaku ini tidak konsisten dengan metode lain Write di BufferedStream.

Contoh berikut menunjukkan perilaku sebelumnya:

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

Perilaku baru

Mulai dari .NET 10, WriteByte metode tidak lagi melakukan flush implisit ketika buffer internal penuh. Buffer hanya dikosongkan ketika metode BufferedStream.Flush() dipanggil secara eksplisit atau ketika BufferedStream dibuang.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perilaku flush BufferedStream.WriteByte(Byte) implisit tidak konsisten dengan metode Write lainnya di kelas BufferedStream, seperti metode Write dan WriteAsync. Inkonsistensi ini dapat menyebabkan masalah performa yang tidak terduga atau efek samping yang tidak diinginkan saat bekerja dengan aliran yang sensitif terhadap operasi flush. Menghilangkan flush implisit memastikan perilaku yang konsisten di setiap metode Write dalam BufferedStream.

Jika aplikasi Anda bergantung pada perilaku flush implisit BufferedStream.WriteByte, perbarui kode Anda untuk secara eksplisit memanggil metode Flush saat diperlukan. Contohnya:

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

API yang terpengaruh