次の方法で共有


BufferedStream.WriteByte は暗黙的なフラッシュを行わなくなりました

内部バッファーがいっぱいになると、 BufferedStream.WriteByte(Byte) メソッドは暗黙的なフラッシュを実行しなくなりました。 この変更により、BufferedStream.WriteByteの動作は、暗黙的なフラッシュを実行しないWriteBufferedStreamなど、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)の暗黙的なフラッシュ動作は、WriteBufferedStreamなど、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