共用方式為


BufferedStream.WriteByte 不再執行隱含排清

當內部緩衝區已滿時,方法 BufferedStream.WriteByte(Byte) 不再執行隱含排清。 這項變更會讓 的BufferedStream.WriteByte行為與類別中的Write其他BufferedStream方法保持一致,例如 BufferedStream.Write(Byte[], Int32, Int32)BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken),這些方法不會執行隱含排清。

推出的版本

.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 類別中的其他方法,例如 BufferedStreamWrite,不一致。 這種不一致可能會在使用對排清作業敏感的串流時,導致非預期的效能問題或非預期的副作用。 移除隱含的 flush 可以確保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