Aracılığıyla paylaş


BufferedStream.WriteByte artık örtük temizleme gerçekleştirmez

BufferedStream.WriteByte(Byte) yöntemi, iç arabellek dolduğunda artık otomatik temizleme gerçekleştirmez. Bu değişiklik, BufferedStream.WriteByte öğesinin davranışını, örtük temizleme gerçekleştirmeyen Write sınıfındaki BufferedStream yöntemleri gibi BufferedStream.Write(Byte[], Int32, Int32) ve BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken) yöntemleriyle hizalar.

Sürüm kullanıma sunulmuştur

.NET 10

Önceki davranış

Daha önce, bir BufferedStream iç arabelleği dolduğunda, WriteByte çağrıldığında arabelleği temel alınan akışa otomatik olarak boşaltıyordu. Bu davranış, içindeki Writediğer BufferedStream yöntemlerle tutarsızdı.

Aşağıdaki örnekte önceki davranış gösterilmektedir:

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

Yeni davranış

.NET 10'dan başlayarak, WriteByte yöntemi dâhili arabellek dolduğunda artık örtük bir temizleme gerçekleştirmez. Arabellek yalnızca BufferedStream.Flush() yöntemi açıkça çağrıldığında veya BufferedStream yok edildiğinde boşaltılır.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir.

Değişiklik nedeni

BufferedStream.WriteByte(Byte) öğesinin örtük temizleme davranışı, Write sınıfındaki BufferedStream gibi Write ve WriteAsync yöntemleriyle tutarlı değildi. Bu tutarsızlık, temizleme işlemlerine duyarlı akışlarla çalışırken beklenmeyen performans sorunlarına veya istenmeyen yan etkilere neden olabilir. Örtük boşaltmanın kaldırılması, Write içindeki tüm BufferedStream yöntemleri arasında tutarlı davranış sağlar.

Uygulamanız BufferedStream.WriteByte'ün örtük temizleme davranışına bağlıysa, gerektiğinde Flush yöntemini açıkça çağırmak için kodunuzu güncelleyin. Örneğin:

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

Etkilenen API'ler