다음을 통해 공유


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 등)와 일치하지 않았습니다. 이러한 불일치로 인해 플러시 작업에 중요한 스트림을 사용할 때 예기치 않은 성능 문제 또는 의도하지 않은 부작용이 발생할 수 있습니다. 암시적 플러시를 제거하면 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