Поделиться через


Функция BufferedStream.WriteByte больше не выполняет автоматический сброс.

Метод BufferedStream.WriteByte(Byte) больше не выполняет неявный сброс, когда внутренний буфер заполнен. Это изменение согласует поведение BufferedStream.WriteByte с другими методами в классе Write, такими как BufferedStream и BufferedStream.Write(Byte[], Int32, Int32), которые не выполняют неявный сброс.

Представленная версия

.NET 10

Предыдущее поведение

Ранее, когда внутренний буфер BufferedStream был полон, вызов WriteByte автоматически сбрасывал буфер в подлежащий поток. Это поведение не соответствовало другим методам Write в BufferedStream.

В следующем примере показано предыдущее поведение:

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

Новое поведение

Начиная с .NET 10 WriteByte метод больше не выполняет неявную очистку при заполнении внутреннего буфера. Буфер очищается только при явном вызове метода BufferedStream.Flush() или при BufferedStream освобождении.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Неявное поведение очистки BufferedStream.WriteByte(Byte) было несогласовано с такими другими методами Write в классе BufferedStream, как Write и WriteAsync. Это несоответствие может привести к непредвиденным проблемам с производительностью или непредвиденным побочным эффектом при работе с потоками, которые чувствительны к операциям очистки. Удаление неявного очистки обеспечивает согласованное поведение всех Write методов в BufferedStream.

Если ваше приложение зависит от неявного поведения очистки BufferedStream.WriteByte, обновите код, чтобы явно вызвать метод Flush при необходимости. Рассмотрим пример.

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