BufferedStream.WriteByte 不再执行隐式刷新

当内部缓冲区已满时,该方法 BufferedStream.WriteByte(Byte) 不再执行隐式刷新。 此更改使BufferedStream.WriteByte的行为与BufferedStream类中的其他方法保持一致,例如BufferedStream.Write(Byte[], Int32, Int32)BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken),它们都不会执行隐式刷新。

已引入的版本

.NET 10 预览版 4

以前的行为

以前,当某个 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方法不一致,例如BufferedStreamWriteWriteAsync 。 在处理对刷新操作敏感的流时,这种不一致可能会导致意外的性能问题或非预期的副作用。 在BufferedStream的所有Write方法中,删除隐式刷新可确保行为一致。

如果应用程序依赖于隐式刷新行为 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