Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Metoda BufferedStream.WriteByte(Byte) nie wykonuje już niejawnego opróżniania, gdy bufor wewnętrzny jest pełny. Ta zmiana dostosowuje zachowanie BufferedStream.WriteByte do innych metod Write w klasie BufferedStream, takich jak BufferedStream.Write(Byte[], Int32, Int32) i BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), które nie wykonują niejawnego opróżniania.
Wersja wprowadzona
.NET 10
Poprzednie zachowanie
Wcześniej, gdy wewnętrzny bufor elementu BufferedStream był pełny, wywołanie WriteByte automatycznie opróżniło bufor do bazowego strumienia. To zachowanie było niespójne z innymi metodami Write w BufferedStream.
W poniższym przykładzie pokazano poprzednie zachowanie:
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
Nowe zachowanie
Począwszy od frameworku .NET 10, metoda WriteByte nie wykonuje już niejawnego czyszczenia, gdy wewnętrzny bufor jest pełny. Bufor jest opróżniany tylko wtedy, gdy metoda BufferedStream.Flush() jest jawnie wywoływana lub gdy BufferedStream jest zlikwidowany.
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Niejawne zachowanie opróżniania bufora przez BufferedStream.WriteByte(Byte) było niespójne z innymi metodami Write w klasie BufferedStream, takimi jak Write i WriteAsync. Ta niespójność może prowadzić do nieoczekiwanych problemów z wydajnością lub niezamierzonych skutków ubocznych podczas pracy ze strumieniami, które są wrażliwe na operacje opróżniania. Usunięcie niejawnego opróżniania zapewnia spójne zachowanie we wszystkich Write metodach w programie BufferedStream.
Zalecana akcja
Jeśli aplikacja korzysta z niejawnego zachowania automatycznego opróżnianiaBufferedStream.WriteByte, zaktualizuj kod, aby jawnie wywołać metodę Flush, gdy jest to potrzebne. Przykład:
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