Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Метод 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